收到xy自动缩放
Dependencies: MQTT SDFileSystem WIZnet_Library mbed
Fork of wmx_laser by
networking.cpp
00001 #include "mbed.h" 00002 #include "WIZnetInterface.h" 00003 #include "MQTTSocket.h" 00004 #include "MQTTClient.h" 00005 #include "networking.h" 00006 00007 extern Serial pc; 00008 //W5500接线 mosi,miso,sclk,cs,reset 00009 WIZnetInterface wiz(PB_5,PB_4,PB_3,PC_14,NC); 00010 //节点名称任取 00011 #define NODE_NAME "laser" 00012 //接在同一子网下的设备MAC地址必须不同 00013 uint8_t mac_addr[6]={0x50,0x51,0x50,0x00,0x00,0x01}; 00014 00015 recv_ctl_cb g_recv_cb; 00016 const char* (*g_actuators)[2]; 00017 static Timer g_timer; 00018 00019 void disable_LSE() //调用此函数将 PC_14, PC_15 用作普通I/O 00020 { 00021 RCC_OscInitTypeDef OscInitStruct; 00022 HAL_RCC_GetOscConfig(&OscInitStruct); 00023 // pc.printf("%u %u %u %u\r\n",OscInitStruct.HSEState,OscInitStruct.LSEState,OscInitStruct.HSIState,OscInitStruct.LSIState); 00024 00025 // Enable access to Backup domain 00026 HAL_PWR_EnableBkUpAccess(); 00027 // Reset Backup domain 00028 __HAL_RCC_BACKUPRESET_FORCE(); 00029 __HAL_RCC_BACKUPRESET_RELEASE(); 00030 // Disable access to Backup domain 00031 HAL_PWR_DisableBkUpAccess(); 00032 00033 OscInitStruct.LSEState=RCC_LSE_OFF; 00034 HAL_RCC_OscConfig(&OscInitStruct); 00035 00036 HAL_RCC_GetOscConfig(&OscInitStruct); 00037 // pc.printf("%u %u %u %u\r\n",OscInitStruct.HSEState,OscInitStruct.LSEState,OscInitStruct.HSIState,OscInitStruct.LSIState); 00038 } 00039 00040 00041 void meta_report(MClient& client, const char* ns, const char* type, 00042 const char* payload = NULL, size_t payload_len = 0, 00043 bool retain = false, MQTT::QoS qos = MQTT::QOS1){ 00044 char topic[64]; 00045 sprintf(topic, "/%s/" NODE_NAME "/%s", ns, type); 00046 int ret = client.publish(topic, (void*)payload, payload_len, qos, retain); 00047 //pc.printf("client.publish()=%d\r\n",ret); 00048 } 00049 void messageArrived(MQTT::MessageData& md) 00050 { 00051 MQTT::Message &message = md.message; 00052 //pc.printf("messageArrived %d,%d\r\n", md.topicName.lenstring.len, message.payloadlen); 00053 00054 // char buf[64]; 00055 // int value, len = sizeof(buf)-1; 00056 // if(message.payloadlen < len) 00057 // len = message.payloadlen; 00058 // memcpy(buf, message.payload, len); 00059 // buf[len] = '\0'; 00060 // sscanf(buf, "%d", &value); 00061 // pc.printf("received %d\r\n", value); 00062 00063 char* payload = new char[message.payloadlen+1]; 00064 if(!payload) 00065 return; 00066 memcpy(payload, message.payload, message.payloadlen); 00067 payload[message.payloadlen]='\0'; 00068 00069 char* topic = new char[md.topicName.lenstring.len+1]; 00070 if(!topic){ 00071 delete[] payload; 00072 return; 00073 } 00074 memcpy(topic, md.topicName.lenstring.data, md.topicName.lenstring.len); 00075 topic[md.topicName.lenstring.len]='\0'; 00076 00077 char *pch = strtok (topic,"/"); 00078 for (int tok=0; tok<2 && pch != NULL; tok++) 00079 { 00080 // pc.printf ("%s\r\n",pch); 00081 pch = strtok (NULL, "/"); 00082 } 00083 if(pch) 00084 g_recv_cb(pch, payload); 00085 delete[] topic; 00086 delete[] payload; 00087 } 00088 00089 void publish_value(MClient &client, const char *topic, const char *buf) 00090 { 00091 meta_report(client, "values",topic,buf,strlen(buf),false); 00092 } 00093 00094 void buildCapability(char *out, const char* infoList[][2]) 00095 { 00096 out[0] = '\0'; 00097 for (int i = 0; infoList[i][0]; ++i) 00098 { 00099 strcat(out, infoList[i][0]); 00100 strcat(out, ","); 00101 strcat(out, infoList[i][1]); 00102 strcat(out, "\\n"); 00103 } 00104 } 00105 00106 int networking_init(MQTTSocket &sock, MClient &client, const char *broker,const char* sensors[][2], const char* actuators[][2], recv_ctl_cb cb) { 00107 int ret; 00108 g_timer.start(); 00109 disable_LSE(); //free LSE pins 00110 wiz.init(mac_addr); 00111 pc.printf("DHCP...\r\n"); 00112 wiz.connect(); 00113 pc.printf("IP: %s\r\n", wiz.getIPAddress()); 00114 00115 srand(rand()^g_timer.read_us()); 00116 00117 ret = sock.connect((char*)broker,1883); 00118 if(ret != 0){ 00119 pc.printf("failed to connect to TCP server\r\n"); 00120 return 1; 00121 } 00122 pc.printf("sock.connect()=%d\r\n",ret); 00123 00124 srand(rand()^g_timer.read_us()); 00125 00126 ret = client.connect(); 00127 if(ret != 0){ 00128 pc.printf("MQTT connect failed\r\n"); 00129 return 1; 00130 } 00131 pc.printf("client.connect()=%d\r\n",ret); 00132 00133 00134 ret = client.subscribe("/control/" NODE_NAME "/+", MQTT::QOS1, messageArrived); 00135 pc.printf("sock.subscribe()=%d\r\n", ret); 00136 00137 g_recv_cb = cb; 00138 g_actuators = actuators; 00139 00140 char * capabilities = new char[128]; 00141 if(!capabilities){ 00142 pc.printf("failed to alloc memory\r\n"); 00143 return 1; 00144 } 00145 //for (int i = 0; actuators[i][0]; ++i){ 00146 // sprintf(capabilities,"/control/" NODE_NAME "/+",actuators[i][0]); 00147 // ret = client.subscribe(capabilities, MQTT::QOS1, messageArrived); 00148 // pc.printf("sock.subscribe(%s)=%d\r\n", capabilities, ret); 00149 // } 00150 00151 //节点上线消息 00152 meta_report(client, "events","online"); 00153 00154 //报告所有可接受的控制指令 00155 buildCapability(capabilities, actuators); 00156 meta_report(client, "capability","control", capabilities, strlen(capabilities), true); 00157 //报告所有的传感器 00158 buildCapability(capabilities, sensors); 00159 meta_report(client, "capability","values", capabilities, strlen(capabilities), true); 00160 delete[] capabilities; 00161 00162 pc.printf("Initialization done.\r\n"); 00163 00164 return 0; 00165 }
Generated on Tue Jul 12 2022 19:57:56 by 1.7.2