您当前的位置:首页 > 互联网教程

Java MQTT 实现物联网通信

发布时间:2025-05-24 19:31:35    发布人:远客网络

Java MQTT 实现物联网通信

一、Java MQTT 实现物联网通信

1、Java中实现物联网通信通过MQTT协议,Eclipse Paho库是一个高效的选择。这个开源库为Java开发者提供了丰富的MQTT客户端功能。以下是一个使用Eclipse Paho的简化步骤:

2、首先,将Eclipse Paho库集成到你的Java项目,可以通过Maven或者直接下载库文件来完成。

3、通过创建MqttClient实例,指定MQTT服务器地址(broker)和唯一客户端标识(clientId),并设置回调函数,以便处理连接状态变化、消息接收和发送确认等关键事件。

4、然后,连接到MQTT服务器,订阅指定的主题(topic),并向该主题发布一条消息,这标志着基本的通信流程开始。

5、在使用完毕后,记得断开与服务器的连接。

6、以上步骤仅为基础设置,实际应用中,你可能需要根据具体需求调整,如处理不同QoS级别、消息持久化、以及用户身份验证等高级功能。

二、mqtt怎么跟django(mqtt和mq)

导读:今天首席CTO笔记来给各位分享关于mqtt怎么跟django的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

'django.contrib.contenttypes',

通信猫调试软件使用这里用串口来举例。首先打开软件,然后在软件右侧中间部位可以看到COM1或者COM5等(这里可以在计算机右键属性,设备管理器中找到串口查看串口号),然后点打开。如果打开成功,刚可以在左侧看到串口的接收数据,如要有乱码就要在配置中修改波物率即可。

软件简介,通信猫调试软件V313,集串口、并口、USB、TCP、UDP、MQTT、蓝牙、WIFI、摄像头调试功能及众多实用小工具于一身的小体积绿色软件。通信猫调试软件是一款mqtt测试软件,能够进行MQTT,TCPIP和串口测试,功能非常丰富,支持串口,并口,TCP服务器,TCP客户端,UDP,HTTP调试。功能实用,有需要可以下载试用看看。

【1】MQTT协议中可指定用户名和密码,在yeelink协议中,用户名变为U-ApiKey,密码为U-ApiKey的具体值。

【2】订阅主题为设备URI,需要把API版本号修改为v1.1

【3】主机名称为mqtt.yeelink.net,而不是api.yeelink.net

在mqtt.js的示例代码中:client=mqtt.connect('mqtt://user:pass@localhost');

在yeelink的示例代码中:client=mqtt.connect("mqtt://U-ApiKey:your_key@mqtt.yeelink.net");

以上的两个示例代码更可以说明各参数的对应关系。

智能硬件,哎,不就是单片机吗?说到底就是一个微控制器,现在出现的智能手表,调光LED灯,蓝牙开锁,WiFi插座等等,说到底不就是单片机开发嘛?单片机,电子和通信专业一般都会教51或AVR、计算机系接触不到。现在流行的Arduino也是单片机开发的一种。

但是要做一款智能硬件,技术上只会单片机编程还是不行的。哎呀嘛什么智能硬件,本质上就是一个电子产品!。所以你要开发一款能拿得出手的智能硬件,电子系统设计必须要会的!

智能硬件与传统的电子产品最大的差别,就是智能硬件连上了网络。要连上网络,就需要用到网络通信模块及学习网络通信协议——TCP/IP。

TCP/IP是一个技术的总称,里面包含两种协议TCP、UDP,位于网络通信分层模型的传输层,同时也是由操作系统管理。而HTTP、DNS、URI等这些技术,属于应用层,位于TCP/UDP之上。同样,最近物联网比较流行的,针对计算能力有限的通讯设备而出的MQTT协议,也属于TCP之上。

为了让电子产品有联网的能力,只要在电路设计上给主控芯片连接一个通信模块,写好收发网络指令的代码,剩下的就是电子产品设计了。

Client/Server架构,即客户端/服务器架构。智能硬件连上后台服务器后,其就是一个客户端,一个终端。由于单片机中资源受限,实际上是不太可能用HTTP协议的,所以互联网中通用的Web服务器开发并不适合这里。有的厂家会在TCP之上自定义协议,有的就移植别人做好的协议比如MQTT,CoAP等等。

服务端开发就比较复杂了。单片机/嵌入式软件开发还好,只要学习好C语言即可打遍天下无敌手,而服务端开发,用Java呢还是Python还是PHP?反正Java和Python选一个就好了,嵌入式出身的工程师,一般都会学Python。

Python服务器端的开发框架种类繁多,Web开发的有Django、FlaskTornadoWebServer,TCP服务器可以用Twisted,等等。MQTT有已经做好的服务器,像这样的服务器不用自己开发,直接部署即可。

1、下载Apollo服务器,下载后解压,然后运行apache-apollo-1.6\bin\apollo.cmd,输入createmybroker(名字任意取,这里是根据官网介绍的来取的)创建服务器实例,服务器实例包含了所有的配置,运行时数据等,并且和一个服务器进程关联。

2、createmybroker之后会在bin目录下生成mybroker文件夹,里面包含有很多信息,其中etc\apollo.xml文件下是配置服务器信息的文件,etc\users.properties文件包含连接MQTT服务器时用到的用户名和密码,后面会介绍,可以修改原始的admin=password,可以接着换行添加新的用户名密码。

3、打开cmd,运行…apache-apollo-1.6\bin\mybroker\bin\apollo-broker.cmdrun开启服务器,可以在浏览器中输入查看是否安装成功,该界面展示了topic,连接数等很多信息。

经过上面的简单步骤,服务器基本上就已经完成,下一篇将介绍Android客户端的编写和注意事项。

客户端使用的API,开始我使用的是mqtt-client,使用过后发现问题百出,不能很好的满足要求,后来使用了官方推荐的EclipsePaho,下面开始客户端代码的编写,为了方便测试这里有android和j2se两个工程:

importjava.util.concurrent.Executors;

importjava.util.concurrent.ScheduledExecutorService;

importjava.util.concurrent.TimeUnit;

importorg.eclipse.paho.client.mqttv3.IMqttDeliveryToken;

importorg.eclipse.paho.client.mqttv3.MqttCallback;

importorg.eclipse.paho.client.mqttv3.MqttClient;

importorg.eclipse.paho.client.mqttv3.MqttConnectOptions;

importorg.eclipse.paho.client.mqttv3.MqttException;

importorg.eclipse.paho.client.mqttv3.MqttMessage;

importorg.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

importandroid.widget.TextView;

publicclassMainActivityextendsActivity{

privateStringhost="tcp://127.0.0.1:1883";

privateStringuserName="admin";

privateStringpassWord="password";

privateStringmyTopic="test/topic";

privateMqttConnectOptionsoptions;

privateScheduledExecutorServicescheduler;

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

resultTv=(TextView)findViewById(R.id.result);

publicvoidhandleMessage(Messagemsg){

Toast.makeText(MainActivity.this,(String)msg.obj,

System.out.println("-----------------------------");

Toast.makeText(MainActivity.this,"连接成功",Toast.LENGTH_SHORT).show();

Toast.makeText(MainActivity.this,"连接失败,系统正在重连",Toast.LENGTH_SHORT).show();

scheduler=Executors.newSingleThreadScheduledExecutor();

scheduler.scheduleAtFixedRate(newRunnable(){

},0*1000,10*1000,TimeUnit.MILLISECONDS);

//host为主机名,test为clientid即连接MQTT的客户端ID,一般以客户端唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存

client=newMqttClient(host,"test",

options=newMqttConnectOptions();

//设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接

options.setCleanSession(true);

options.setUserName(userName);

options.setPassword(passWord.toCharArray());

options.setConnectionTimeout(10);

//设置会话心跳时间单位为秒服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制

options.setKeepAliveInterval(20);

client.setCallback(newMqttCallback(){

publicvoidconnectionLost(Throwablecause){

//连接丢失后,一般在这里面进行重连

System.out.println("connectionLost----------");

publicvoiddeliveryComplete(IMqttDeliveryTokentoken){

System.out.println("deliveryComplete---------"

publicvoidmessageArrived(StringtopicName,MqttMessagemessage)

//subscribe后得到的消息会执行到这里面

System.out.println("messageArrived----------");

msg.obj=topicName+"---"+message.toString();

publicbooleanonKeyDown(intkeyCode,KeyEventevent){

if(client!=nullkeyCode==KeyEvent.KEYCODE_BACK){

returnsuper.onKeyDown(keyCode,event);

由于项目需要,我用到了心跳重连。根据这里的解释设置apollo.xml,主要有设置主机连接的地址。另外,options还有个setWill方法,如果项目中需要知道客户端是否掉线可以调用该方法。

结语:以上就是首席CTO笔记为大家整理的关于mqtt怎么跟django的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~

三、java服务器推送消息给android

1)轮询(Pull)方式:客户端定时向服务器发送询问消息,一旦服务器有变化则立即同步消息。

2)SMS(Push)方式:通过拦截SMS消息并且解析消息内容来了解服务器的命令,但这种方式一般用户在经济上很难承受。

3)持久连接(Push)方式:客户端和服务器之间建立长久连接,这样就可以实现消息的及时行和实时性。

在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务。Android

Cloud to Device Messaging(C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。

该方案存在的主要问题是C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用。

采用MQTT协议实现Android推送功能也是一种解决方案。MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。

是IBM提供的MQTT协议的实现。我们可以从这里()下载该项目的实例代码,并且可以找到一个采用PHP书写的服务器端实现()。

Really Small Message Broker(RSMB)

,是一个简单的MQTT代理,同样由IBM提供,其查看地址是:。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。SAM是一个针对MQTT写的PHP库。我们可以从这个地址下载它.

Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。

androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。但也存在一些不足之处:

比如时间过长时,就再也收不到推送的信息了。

3)如果将消息从服务器上推送出去,就不再管理了,不管消息是否成功到达客户端手机上。

如果我们要使用androidpn,则还需要做大量的工作,需要理解XMPP协议、理解Androidpn的实现机制,需要调试内部存在的BUG。