EthW5500+STM32

Dependencies:   MQTT WIZnet_Library mbed

Fork of EthW5500 by YX ZHANG

Committer:
zhangyx
Date:
Fri Aug 25 15:08:59 2017 +0000
Revision:
0:1170747a672f
Child:
1:9689429a0a29
STM32 + W5500 + MQTT

Who changed what in which revision?

UserRevisionLine numberNew contents of line
zhangyx 0:1170747a672f 1 #include "mbed.h"
zhangyx 0:1170747a672f 2 #include "WIZnetInterface.h"
zhangyx 0:1170747a672f 3 #include "MQTTSocket.h"
zhangyx 0:1170747a672f 4 #include "MQTTClient.h"
zhangyx 0:1170747a672f 5
zhangyx 0:1170747a672f 6 DigitalIn BTN(PC_13);
zhangyx 0:1170747a672f 7 //W5500接线 mosi,miso,sclk,cs,reset
zhangyx 0:1170747a672f 8 WIZnetInterface wiz(PA_7,PA_6,PA_5,PB_6,PC_7);
zhangyx 0:1170747a672f 9 //节点名称任取
zhangyx 0:1170747a672f 10 #define NODE_NAME "n_12345"
zhangyx 0:1170747a672f 11 //接在同一子网下的设备MAC地址必须不同
zhangyx 0:1170747a672f 12 uint8_t mac_addr[6]={0x50,0x51,0x50,0x00,0x00,0x01};
zhangyx 0:1170747a672f 13
zhangyx 0:1170747a672f 14 typedef MQTT::Client<MQTTSocket,Countdown> MClient;
zhangyx 0:1170747a672f 15 void meta_report(MClient& client, const char* ns, const char* type,
zhangyx 0:1170747a672f 16 const char* payload = NULL, size_t payload_len = 0,
zhangyx 0:1170747a672f 17 bool retain = false, MQTT::QoS qos = MQTT::QOS1){
zhangyx 0:1170747a672f 18 char topic[64];
zhangyx 0:1170747a672f 19 sprintf(topic, "/%s/" NODE_NAME "/%s", ns, type);
zhangyx 0:1170747a672f 20 int ret = client.publish(topic, (void*)payload, payload_len, qos, retain);
zhangyx 0:1170747a672f 21 printf("client.publish()=%d\r\n",ret);
zhangyx 0:1170747a672f 22 }
zhangyx 0:1170747a672f 23 void messageArrived(MQTT::MessageData& md)
zhangyx 0:1170747a672f 24 {
zhangyx 0:1170747a672f 25 MQTT::Message &message = md.message;
zhangyx 0:1170747a672f 26 char buf[64];
zhangyx 0:1170747a672f 27 int value, len = sizeof(buf)-1;
zhangyx 0:1170747a672f 28 if(message.payloadlen < len)
zhangyx 0:1170747a672f 29 len = message.payloadlen;
zhangyx 0:1170747a672f 30 memcpy(buf, message.payload, len);
zhangyx 0:1170747a672f 31 buf[len] = '\0';
zhangyx 0:1170747a672f 32 sscanf(buf, "%d", &value);
zhangyx 0:1170747a672f 33 printf("received %d\r\n", value);
zhangyx 0:1170747a672f 34 }
zhangyx 0:1170747a672f 35
zhangyx 0:1170747a672f 36 int main() {
zhangyx 0:1170747a672f 37 int ret;
zhangyx 0:1170747a672f 38 wiz.init(mac_addr);
zhangyx 0:1170747a672f 39 wiz.connect();
zhangyx 0:1170747a672f 40 printf("IP: %s\r\n", wiz.getIPAddress());
zhangyx 0:1170747a672f 41
zhangyx 0:1170747a672f 42 MQTTSocket sock;
zhangyx 0:1170747a672f 43 MClient client(sock);
zhangyx 0:1170747a672f 44
zhangyx 0:1170747a672f 45 ret = sock.connect("tdxls-iot.xicp.net",1883);
zhangyx 0:1170747a672f 46 if(ret != 0){
zhangyx 0:1170747a672f 47 printf("failed to connect to TCP server\r\n");
zhangyx 0:1170747a672f 48 return 1;
zhangyx 0:1170747a672f 49 }
zhangyx 0:1170747a672f 50 printf("sock.connect()=%d\r\n",ret);
zhangyx 0:1170747a672f 51
zhangyx 0:1170747a672f 52 ret = client.connect();
zhangyx 0:1170747a672f 53 if(ret != 0){
zhangyx 0:1170747a672f 54 printf("MQTT connect failed\r\n");
zhangyx 0:1170747a672f 55 return 1;
zhangyx 0:1170747a672f 56 }
zhangyx 0:1170747a672f 57 printf("client.connect()=%d\r\n",ret);
zhangyx 0:1170747a672f 58
zhangyx 0:1170747a672f 59 const char* actuators = "switch,int\n";
zhangyx 0:1170747a672f 60 const char* sensors = "analog,mV\n";
zhangyx 0:1170747a672f 61
zhangyx 0:1170747a672f 62 ret = client.subscribe("/control/" NODE_NAME "/switch", MQTT::QOS1, messageArrived);
zhangyx 0:1170747a672f 63 printf("sock.subscribe()=%d\r\n",ret);
zhangyx 0:1170747a672f 64
zhangyx 0:1170747a672f 65 //节点上线消息
zhangyx 0:1170747a672f 66 meta_report(client, "events","online");
zhangyx 0:1170747a672f 67 //报告所有可接受的控制指令
zhangyx 0:1170747a672f 68 meta_report(client, "capability","control", actuators, strlen(actuators), true);
zhangyx 0:1170747a672f 69 //报告所有的传感器
zhangyx 0:1170747a672f 70 meta_report(client, "capability","values", sensors, strlen(sensors), true);
zhangyx 0:1170747a672f 71
zhangyx 0:1170747a672f 72 bool btn = 0;
zhangyx 0:1170747a672f 73 while(1){
zhangyx 0:1170747a672f 74 bool newBTN = BTN;
zhangyx 0:1170747a672f 75 if(newBTN != btn){
zhangyx 0:1170747a672f 76 char buf[16];
zhangyx 0:1170747a672f 77 int value = newBTN ? 3300 : 0;
zhangyx 0:1170747a672f 78 sprintf(buf, "%d mV", value);
zhangyx 0:1170747a672f 79 meta_report(client, "values","analog",buf,strlen(buf),true);
zhangyx 0:1170747a672f 80 btn = newBTN;
zhangyx 0:1170747a672f 81 }else{
zhangyx 0:1170747a672f 82 client.yield(100);
zhangyx 0:1170747a672f 83 }
zhangyx 0:1170747a672f 84 }
zhangyx 0:1170747a672f 85 }