1503 lines
54 KiB
Plaintext
1503 lines
54 KiB
Plaintext
|
#if 0
|
|||
|
char *ptr =NULL;
|
|||
|
char str[]="1&2&100&12&200";
|
|||
|
int tempil;
|
|||
|
int Eflag;
|
|||
|
//char str[]="12";
|
|||
|
// ptr = strchr(str, '&');
|
|||
|
// if (NULL != ptr) {
|
|||
|
// printf("Character: %s\n", ptr);
|
|||
|
// printf("Character: %c\n", *ptr);
|
|||
|
// printf("Offset: %ld\n", ptr - str);
|
|||
|
// }
|
|||
|
// ptr++;
|
|||
|
// ptr = strchr(ptr, '&');
|
|||
|
// if (NULL != ptr) {
|
|||
|
// printf("Character: %s\n", ptr);
|
|||
|
// printf("Character: %c\n", *ptr);
|
|||
|
// printf("Offset: %ld\n", ptr - str);
|
|||
|
// }
|
|||
|
DebugPrint("Str:%s\n",str);
|
|||
|
Eflag=eSDAddFind_Str_Notzero;
|
|||
|
for(tempil=0;tempil<32;tempil++)
|
|||
|
{
|
|||
|
ptr=strcpynsubstr(str,'&',tempil,&Eflag);
|
|||
|
if (NULL != ptr)
|
|||
|
{
|
|||
|
DebugPrint("Ch%d: %s %d\n",tempil, ptr,Eflag);
|
|||
|
//DebugPrint("Ch%d: %c\n",tempil, *ptr);
|
|||
|
if(Eflag==eSDAddFind_Str_End)
|
|||
|
break;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
return 0;
|
|||
|
#endif
|
|||
|
#define BROKER_ADDRESS "116.236.50.106:8764" //汇珏网络测试
|
|||
|
#define CLIENTID "hjcid-01" //客户端id
|
|||
|
#define USERNAME "hjemq-c1" //用户名
|
|||
|
#define PASSWORD "Hj57471000" //密码
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#if 0
|
|||
|
MQTTClient client;
|
|||
|
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
|
|||
|
MQTTClient_willOptions will_opts = MQTTClient_willOptions_initializer;
|
|||
|
MQTTClient_message pubmsg = MQTTClient_message_initializer;
|
|||
|
int rc;
|
|||
|
int Temp_Counter;
|
|||
|
|
|||
|
/* 创建mqtt客户端对象 */
|
|||
|
if (MQTTCLIENT_SUCCESS !=
|
|||
|
(rc = MQTTClient_create(&client, BROKER_ADDRESS, CLIENTID,
|
|||
|
MQTTCLIENT_PERSISTENCE_NONE, NULL))) {
|
|||
|
printf("Failed to create client, return code %d\n", rc);
|
|||
|
rc = EXIT_FAILURE;
|
|||
|
//goto exit;
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void analysisJsonPrint(cJSON *json) {
|
|||
|
if (NULL == json) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
cJSON *json_name = cJSON_GetObjectItem(json, "name");
|
|||
|
printJsonObjvalue(json_name);
|
|||
|
|
|||
|
cJSON *json_age = cJSON_GetObjectItem(json, "age");
|
|||
|
printJsonObjvalue(json_age);
|
|||
|
|
|||
|
cJSON *json_professional = cJSON_GetObjectItem(json, "professional");
|
|||
|
cJSON *json_professional_child = json_professional->child;
|
|||
|
while (json_professional_child != NULL) {
|
|||
|
printJsonObjvalue(json_professional_child);
|
|||
|
json_professional_child = json_professional_child->next;
|
|||
|
}
|
|||
|
|
|||
|
cJSON *json_languages = cJSON_GetObjectItem(json, "languages");
|
|||
|
if (NULL == json_languages) {
|
|||
|
int size = cJSON_GetArraySize(json_languages);
|
|||
|
printf("%s size:%d\n", json_languages->string, size);
|
|||
|
int i;
|
|||
|
for(i=0;i<size;i++) {
|
|||
|
cJSON *json_languages_child = cJSON_GetArrayItem(json_languages, i);
|
|||
|
printJsonObjvalue(json_languages_child);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
cJSON *json_phone = cJSON_GetObjectItem(json, "phone");
|
|||
|
cJSON *json_phone_number = cJSON_GetObjectItem(json_phone,"number");
|
|||
|
cJSON *json_phone_type = cJSON_GetObjectItem(json_phone,"type");
|
|||
|
printJsonObjvalue(json_phone_number);
|
|||
|
printJsonObjvalue(json_phone_type);
|
|||
|
|
|||
|
cJSON *json_courses = cJSON_GetObjectItem(json, "courses");
|
|||
|
if (json_courses) {
|
|||
|
int size = cJSON_GetArraySize(json_courses);
|
|||
|
printf("%s size:%d\n", json_courses->string, size);
|
|||
|
int i;
|
|||
|
for(i=0;i<size;i++) {
|
|||
|
cJSON *arrayItem = cJSON_GetArrayItem(json_courses, i);
|
|||
|
if (NULL != arrayItem) {
|
|||
|
cJSON *json_course_name = cJSON_GetObjectItem(arrayItem,"name");
|
|||
|
cJSON *json_course_price = cJSON_GetObjectItem(arrayItem,"price");
|
|||
|
printJsonObjvalue(json_course_name);
|
|||
|
printJsonObjvalue(json_course_price);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
cJSON *json_vip = cJSON_GetObjectItem(json, "vip");
|
|||
|
printJsonObjvalue(json_vip);
|
|||
|
|
|||
|
cJSON *json_address = cJSON_GetObjectItem(json, "address");
|
|||
|
printJsonObjvalue(json_address);
|
|||
|
}
|
|||
|
|
|||
|
//读取JSON
|
|||
|
cJSON* readJsonFile(char *fileName) {
|
|||
|
if (NULL == fileName) {
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
|
|||
|
FILE *fp = NULL;
|
|||
|
cJSON *json = NULL;
|
|||
|
char line[1024] = {0};
|
|||
|
char *data = NULL;
|
|||
|
|
|||
|
//打开一个文本文件,文件必须存在,只允许读
|
|||
|
fp = fopen(fileName, "r");
|
|||
|
if (NULL != fp) {
|
|||
|
//seek末尾
|
|||
|
fseek(fp, 0, SEEK_END);
|
|||
|
//读取文件大小
|
|||
|
long len = ftell(fp);
|
|||
|
//seek起始位值
|
|||
|
fseek(fp, 0, SEEK_SET);
|
|||
|
data = (char*)malloc(len + 1);
|
|||
|
fread(data, 1, len, fp);
|
|||
|
fclose(fp);
|
|||
|
}
|
|||
|
|
|||
|
printf("readJsonFile data:%s\n", data);
|
|||
|
cJSON *json_root = cJSON_Parse(data);
|
|||
|
if (NULL == json_root) {
|
|||
|
printf("cJSON_Parse error:%s\n", cJSON_GetErrorPtr());
|
|||
|
}
|
|||
|
|
|||
|
if (NULL != data) {
|
|||
|
free(data);
|
|||
|
}
|
|||
|
|
|||
|
return json_root;
|
|||
|
}
|
|||
|
|
|||
|
//解析JSON
|
|||
|
void analysisJsonObj(cJSON *json) {
|
|||
|
if (NULL == json) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
//解析name
|
|||
|
cJSON *json_name = cJSON_GetObjectItem(json, "name");
|
|||
|
printf("root[%s:%s]\n", json_name->string, json_name->valuestring);
|
|||
|
//解析age
|
|||
|
cJSON *json_age = cJSON_GetObjectItem(json, "age");
|
|||
|
printf("root[%s:%d]\n", json_age->string, json_age->valueint);
|
|||
|
|
|||
|
//解析professional, 通过调用child和next遍历解析
|
|||
|
cJSON *json_professional = cJSON_GetObjectItem(json, "professional");
|
|||
|
cJSON *json_professional_child = json_professional->child;
|
|||
|
while (json_professional_child != NULL) {
|
|||
|
printf("%s[%s:%d]\n", json_professional->string, json_professional_child->string, json_professional_child->valueint);
|
|||
|
json_professional_child = json_professional_child->next;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//解析languages, 注意languages是一个数组
|
|||
|
cJSON *json_languages = cJSON_GetObjectItem(json, "languages");
|
|||
|
if (json_languages) {
|
|||
|
int size = cJSON_GetArraySize(json_languages);
|
|||
|
printf("%s size:%d\n", json_languages->string, size);
|
|||
|
int i;
|
|||
|
for(i=0;i<size;i++) {
|
|||
|
cJSON *json_languages_child =cJSON_GetArrayItem(json_languages, i);
|
|||
|
printf("%s[%d:%s]\n", json_languages->string, i, json_languages_child->valuestring);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//解析phone. 另一种方式解析, 直接通过名字获取
|
|||
|
cJSON *json_phone = cJSON_GetObjectItem(json, "phone");
|
|||
|
cJSON *json_phone_number = cJSON_GetObjectItem(json_phone,"number");
|
|||
|
cJSON *json_phone_type = cJSON_GetObjectItem(json_phone,"type");
|
|||
|
printf("%s[%s:%s]\n", json_phone->string, json_phone_number->string, json_phone_number->valuestring);
|
|||
|
printf("%s[%s:%s]\n", json_phone->string, json_phone_type->string, json_phone_type->valuestring);
|
|||
|
|
|||
|
//解析courses
|
|||
|
cJSON *json_courses = cJSON_GetObjectItem(json, "courses");
|
|||
|
if (json_courses) {
|
|||
|
int size = cJSON_GetArraySize(json_courses);
|
|||
|
printf("%s size:%d\n", json_courses->string, size);
|
|||
|
int i;
|
|||
|
for(i=0;i<size;i++) {
|
|||
|
cJSON *json_array = cJSON_GetArrayItem(json_courses, i);
|
|||
|
if (json_array) {
|
|||
|
cJSON *json_course_name = cJSON_GetObjectItem(json_array,"name");
|
|||
|
cJSON *json_course_price = cJSON_GetObjectItem(json_array,"price");
|
|||
|
printf("%s[%s:%.1lf]\n", json_courses->string, json_course_name->string, json_course_name->valuedouble);
|
|||
|
printf("%s[%s:%.1lf]\n", json_courses->string, json_course_price->string, json_course_price->valuedouble);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//解析vip, vip是布尔值, 有两种方式解析获取
|
|||
|
cJSON *json_vip = cJSON_GetObjectItem(json, "vip");
|
|||
|
/*
|
|||
|
if (json_vip->type == cJSON_True) {
|
|||
|
printf("root[%s:true]\n", json_vip->string);
|
|||
|
} else if (json_vip->type == cJSON_False) {
|
|||
|
printf("root[%s:false]\n", json_vip->string);
|
|||
|
} else {
|
|||
|
printf("root[%s:false]\n", json_vip->string);
|
|||
|
}
|
|||
|
*/
|
|||
|
cJSON_bool bvip = cJSON_IsBool(json_vip);
|
|||
|
if (bvip == cJSON_True) {//cJSON_False
|
|||
|
printf("root[%s:true]\n", json_vip->string);
|
|||
|
} else {
|
|||
|
printf("root[%s:false]\n", json_vip->string);
|
|||
|
}
|
|||
|
|
|||
|
//解析address
|
|||
|
cJSON *json_address = cJSON_GetObjectItem(json, "address");
|
|||
|
if (json_address->type ==cJSON_NULL) {
|
|||
|
printf("root[%s:null]\n", json_address->string);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//获取cJSON对象的类型, 并同时打印值
|
|||
|
static void printJsonObjvalue(const cJSON *json) {
|
|||
|
if (NULL == json) {
|
|||
|
printf("NULL object!\n");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
switch (json->type) {
|
|||
|
case cJSON_False:
|
|||
|
printf("%s: false\n", json->string);
|
|||
|
break;
|
|||
|
case cJSON_True:
|
|||
|
printf("%s: true\n", json->string);
|
|||
|
break;
|
|||
|
case cJSON_NULL:
|
|||
|
printf("%s: cJSON_NULL\n", json->string);
|
|||
|
break;
|
|||
|
case cJSON_Number:
|
|||
|
printf("%s: %d, %f\n", json->string, json->valueint, json->valuedouble);
|
|||
|
break;
|
|||
|
case cJSON_String:
|
|||
|
printf("%s: %s\n", json->string, json->valuestring);
|
|||
|
break;
|
|||
|
case cJSON_Array:
|
|||
|
printf("%s: cJSON_Array\n", json->string);
|
|||
|
break;
|
|||
|
case cJSON_Object:
|
|||
|
printf("%s: cJSON_Object\n", json->string);
|
|||
|
break;
|
|||
|
default:
|
|||
|
printf("unknown type\n");
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
cJSON *root = NULL;
|
|||
|
|
|||
|
|
|||
|
//读取json
|
|||
|
cJSON *json_root = readJsonFile(fileName);
|
|||
|
//解析json
|
|||
|
analysisJsonObj(json_root);
|
|||
|
//解析json
|
|||
|
analysisJsonPrint(json_root);
|
|||
|
|
|||
|
// char *fileName = "../JsonTable/persontest.json";
|
|||
|
char *fileName = "/home/EdgeGateway_FSU_App/persontest.json";
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#define TEMPCOUNTER_MAX 60
|
|||
|
#define TEMPCOUNTER_TEMP_S 10
|
|||
|
#define TEMPCOUNTER_Time_S 2
|
|||
|
#define TEMPCOUNTER_Weather_S 60
|
|||
|
MQTTClient_message tempmsg = MQTTClient_message_initializer;
|
|||
|
char temp_str[10] = {0};
|
|||
|
char tm_str[50] = {0};
|
|||
|
char Wh_str[2][50] = {"clear day","cloudy day"};
|
|||
|
int weather_Flag=0;
|
|||
|
//int fd;
|
|||
|
/* 向服务端发布芯片温度信息 */
|
|||
|
for ( ; ; ) {
|
|||
|
|
|||
|
if(Temp_Counter<TEMPCOUNTER_MAX)
|
|||
|
{
|
|||
|
Temp_Counter++;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Temp_Counter=0;
|
|||
|
}
|
|||
|
|
|||
|
if((Temp_Counter%TEMPCOUNTER_TEMP_S)==0) //温度
|
|||
|
{
|
|||
|
/* 读取温度值 */
|
|||
|
fd = open("/sys/class/thermal/thermal_zone0/temp", O_RDONLY);
|
|||
|
read(fd, temp_str, sizeof(temp_str));//读取temp属性文件即可获取温度
|
|||
|
close(fd);
|
|||
|
|
|||
|
printf("Temp %s\n", temp_str);
|
|||
|
|
|||
|
/* 发布温度信息 */
|
|||
|
tempmsg.payload = temp_str; //消息的内容
|
|||
|
tempmsg.payloadlen = strlen(temp_str); //内容的长度
|
|||
|
tempmsg.qos = 0; //QoS等级
|
|||
|
tempmsg.retained = 1; //保留消息
|
|||
|
if (MQTTCLIENT_SUCCESS !=
|
|||
|
(rc = MQTTClient_publishMessage(client, TEMP_TOPIC, &tempmsg, NULL))) {
|
|||
|
printf("Failed to publish message, return code %d\n", rc);
|
|||
|
rc = EXIT_FAILURE;
|
|||
|
goto unsubscribe_exit;
|
|||
|
}
|
|||
|
}
|
|||
|
if((Temp_Counter%TEMPCOUNTER_Time_S)==0) //时间
|
|||
|
{
|
|||
|
/* 读取时间值 */
|
|||
|
time_t tm;
|
|||
|
/* 获取时间 */
|
|||
|
tm = time(NULL);
|
|||
|
if (-1 == tm) {
|
|||
|
perror("time error");
|
|||
|
exit(-1);
|
|||
|
}
|
|||
|
/* 将时间转换为字符串形式 */
|
|||
|
ctime_r(&tm, tm_str);
|
|||
|
/* 打印输出 */
|
|||
|
printf("当前时间: %s", tm_str);
|
|||
|
|
|||
|
/* 发布时间信息 */
|
|||
|
tempmsg.payload = tm_str; //消息的内容
|
|||
|
tempmsg.payloadlen = strlen(tm_str); //内容的长度
|
|||
|
tempmsg.qos = 0; //QoS等级
|
|||
|
tempmsg.retained = 1; //保留消息
|
|||
|
if (MQTTCLIENT_SUCCESS !=
|
|||
|
(rc = MQTTClient_publishMessage(client, TIME_TOPIC, &tempmsg, NULL))) {
|
|||
|
printf("Failed to publish message, return code %d\n", rc);
|
|||
|
rc = EXIT_FAILURE;
|
|||
|
goto unsubscribe_exit;
|
|||
|
}
|
|||
|
}
|
|||
|
if((Temp_Counter%TEMPCOUNTER_Weather_S)==0) //天气
|
|||
|
{
|
|||
|
/* 天气 */
|
|||
|
printf("Temp %s\n", Wh_str[weather_Flag]);
|
|||
|
|
|||
|
/* 发布天气信息 */
|
|||
|
tempmsg.payload = Wh_str[weather_Flag]; //消息的内容
|
|||
|
tempmsg.payloadlen = strlen(Wh_str[weather_Flag]); //内容的长度
|
|||
|
tempmsg.qos = 0; //QoS等级
|
|||
|
tempmsg.retained = 1; //保留消息
|
|||
|
if (MQTTCLIENT_SUCCESS !=
|
|||
|
(rc = MQTTClient_publishMessage(client, WEATHER_TOPIC, &tempmsg, NULL))) {
|
|||
|
printf("Failed to publish message, return code %d\n", rc);
|
|||
|
rc = EXIT_FAILURE;
|
|||
|
goto unsubscribe_exit;
|
|||
|
}
|
|||
|
|
|||
|
if(weather_Flag)
|
|||
|
{
|
|||
|
weather_Flag=0;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
weather_Flag=1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
sleep(1); //每隔1秒 更新一次数据
|
|||
|
//sleep(30); //每隔30秒 更新一次数据
|
|||
|
}
|
|||
|
|
|||
|
unsubscribe_exit:
|
|||
|
if (MQTTCLIENT_SUCCESS !=
|
|||
|
(rc = MQTTClient_unsubscribe(client, LED_TOPIC))) {
|
|||
|
printf("Failed to unsubscribe, return code %d\n", rc);
|
|||
|
rc = EXIT_FAILURE;
|
|||
|
}
|
|||
|
disconnect_exit:
|
|||
|
if (MQTTCLIENT_SUCCESS !=
|
|||
|
(rc = MQTTClient_disconnect(client, 10000))) {
|
|||
|
printf("Failed to disconnect, return code %d\n", rc);
|
|||
|
rc = EXIT_FAILURE;
|
|||
|
}
|
|||
|
destroy_exit:
|
|||
|
MQTTClient_destroy(&client);
|
|||
|
exit:
|
|||
|
return rc;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#define TEMPCOUNTER_MAX 60
|
|||
|
#define TEMPCOUNTER_TEMP_S 10
|
|||
|
#define TEMPCOUNTER_Time_S 2
|
|||
|
#define TEMPCOUNTER_Weather_S 60
|
|||
|
MQTTClient_message tempmsg = MQTTClient_message_initializer;
|
|||
|
char temp_str[10] = {0};
|
|||
|
char tm_str[50] = {0};
|
|||
|
char Wh_str[2][50] = {"clear day","cloudy day"};
|
|||
|
int weather_Flag=0;
|
|||
|
//int fd;
|
|||
|
/* 向服务端发布芯片温度信息 */
|
|||
|
for ( ; ; ) {
|
|||
|
|
|||
|
if(Temp_Counter<TEMPCOUNTER_MAX)
|
|||
|
{
|
|||
|
Temp_Counter++;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Temp_Counter=0;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if((Temp_Counter%TEMPCOUNTER_Time_S)==0) //时间
|
|||
|
{
|
|||
|
/* 读取时间值 */
|
|||
|
time_t tm;
|
|||
|
/* 获取时间 */
|
|||
|
tm = time(NULL);
|
|||
|
if (-1 == tm) {
|
|||
|
perror("time error");
|
|||
|
exit(-1);
|
|||
|
}
|
|||
|
/* 将时间转换为字符串形式 */
|
|||
|
ctime_r(&tm, tm_str);
|
|||
|
/* 打印输出 */
|
|||
|
printf("当前时间: %s", tm_str);
|
|||
|
|
|||
|
/* 发布时间信息 */
|
|||
|
tempmsg.payload = tm_str; //消息的内容
|
|||
|
tempmsg.payloadlen = strlen(tm_str); //内容的长度
|
|||
|
tempmsg.qos = 0; //QoS等级
|
|||
|
tempmsg.retained = 1; //保留消息
|
|||
|
if (MQTTCLIENT_SUCCESS !=
|
|||
|
(rc = MQTTClient_publishMessage(client, TIME_TOPIC, &tempmsg, NULL))) {
|
|||
|
printf("Failed to publish message, return code %d\n", rc);
|
|||
|
rc = EXIT_FAILURE;
|
|||
|
goto unsubscribe_exit;
|
|||
|
}
|
|||
|
}
|
|||
|
if((Temp_Counter%TEMPCOUNTER_Weather_S)==0) //天气
|
|||
|
{
|
|||
|
/* 天气 */
|
|||
|
printf("Temp %s\n", Wh_str[weather_Flag]);
|
|||
|
|
|||
|
/* 发布天气信息 */
|
|||
|
tempmsg.payload = Wh_str[weather_Flag]; //消息的内容
|
|||
|
tempmsg.payloadlen = strlen(Wh_str[weather_Flag]); //内容的长度
|
|||
|
tempmsg.qos = 0; //QoS等级
|
|||
|
tempmsg.retained = 1; //保留消息
|
|||
|
if (MQTTCLIENT_SUCCESS !=
|
|||
|
(rc = MQTTClient_publishMessage(client, WEATHER_TOPIC, &tempmsg, NULL))) {
|
|||
|
printf("Failed to publish message, return code %d\n", rc);
|
|||
|
rc = EXIT_FAILURE;
|
|||
|
goto unsubscribe_exit;
|
|||
|
}
|
|||
|
|
|||
|
if(weather_Flag)
|
|||
|
{
|
|||
|
weather_Flag=0;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
weather_Flag=1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
sleep(1); //每隔1秒 更新一次数据
|
|||
|
//sleep(30); //每隔30秒 更新一次数据
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
unsubscribe_exit:
|
|||
|
if (MQTTCLIENT_SUCCESS !=
|
|||
|
(rc = MQTTClient_unsubscribe(client, LED_TOPIC))) {
|
|||
|
printf("Failed to unsubscribe, return code %d\n", rc);
|
|||
|
rc = EXIT_FAILURE;
|
|||
|
}
|
|||
|
disconnect_exit:
|
|||
|
if (MQTTCLIENT_SUCCESS !=
|
|||
|
(rc = MQTTClient_disconnect(client, 10000))) {
|
|||
|
printf("Failed to disconnect, return code %d\n", rc);
|
|||
|
rc = EXIT_FAILURE;
|
|||
|
}
|
|||
|
destroy_exit:
|
|||
|
MQTTClient_destroy(&client);
|
|||
|
exit:
|
|||
|
return rc;
|
|||
|
|
|||
|
/* 客户端id、用户名、密码 *
|
|||
|
* 当您成功申请到然也物联平台的社区版MQTT服务后
|
|||
|
* 然也物联工作人员会给你发送8组用于连接社区版MQTT服务器
|
|||
|
* 的客户端连接认证信息:也就是客户端id、用户名和密码
|
|||
|
* 注意一共有8组,您选择其中一组覆盖下面的示例值
|
|||
|
* 后续我们使用MQTT.fx或MQTTool的时候 也需要使用一组连接认证信息
|
|||
|
* 去连接社区版MQTT服务器!
|
|||
|
* 由于这是属于个人隐私 笔者不可能将自己的信息写到下面 */
|
|||
|
//#define CLIENTID "您的客户端ID" //客户端id
|
|||
|
//#define USERNAME "您的用户名" //用户名
|
|||
|
//#define PASSWORD "您的密码" //密码
|
|||
|
// #define CLIENTID "MQTT_kooloo1989" //客户端id
|
|||
|
// #define USERNAME "您的用户名" //用户名
|
|||
|
// #define PASSWORD "您的密码" //密码
|
|||
|
|
|||
|
// #define CLIENTID "hjcid-01" //客户端id
|
|||
|
// #define USERNAME "hjemq-c1" //用户名
|
|||
|
// #define PASSWORD "Hj57471000" //密码
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//获取 网关发布遗嘱主题到服务器
|
|||
|
strSql = "select OID,Value,Factor from CfgTab_devInfo";
|
|||
|
nResult = sqlite3_get_table(pdb, strSql, &pResult, &nRow, &nCol, &errmsg);
|
|||
|
|
|||
|
ms_info1("koius nCol =%d nRow =%d %s\n", nCol,nRow,pResult[0]);
|
|||
|
|
|||
|
int kk;
|
|||
|
for(kk=0;kk<(nRow);kk++)
|
|||
|
{
|
|||
|
ms_info2("%s ",pResult[kk*3]);
|
|||
|
ms_info2("%s ",pResult[kk*3+1]);
|
|||
|
ms_info2("%s ",pResult[kk*3+2]);
|
|||
|
ms_info2("\r\n");
|
|||
|
}
|
|||
|
|
|||
|
if ((nResult != SQLITE_OK) || (pResult[nCol] == NULL))
|
|||
|
{
|
|||
|
goto end;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//strncpy(g_DeviceCfg.MqttConf.MqttWillToplic_Server, pResult[nCol], ePublicTopic_Len);
|
|||
|
ms_info1("网关发布遗嘱主题到服务器--> %s\n", g_DeviceCfg.MqttConf.MqttWillToplic_Server);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//汉字比对测试
|
|||
|
//koolootest
|
|||
|
if (!strcmp("汇珏网络", g_DeviceCfg.devConf.Brand))
|
|||
|
{
|
|||
|
|
|||
|
printf("汉字测试\r\n"); //kooloo add 202312
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
char Temp_Str[100]={0}; //临时变量 kooloo 直接往strSql尾部添加字符串会造成Segmentation fault
|
|||
|
//查表CfgTab_S_DevicePort0FuncDef kooloo add 2023092101
|
|||
|
strcpy(Temp_Str,"select * from "); //先复制 再添加 kooloo add 202309
|
|||
|
strcat(Temp_Str,CtgTab_S_DevicePortFuncDef_Buf[Tempj]); //将表名添加 kooloo add 20230928
|
|||
|
nResult = sqlite3_get_table(pdb, Temp_Str, &pResult, &nRow, &nCol, &errmsg);
|
|||
|
|
|||
|
|
|||
|
/* 打印系统信息 */
|
|||
|
// ms_info1("uptime: %ld\r\n", pSysPara->sys_info.uptime); /* 自系统启动之后所经过的时间(以秒为单位) */
|
|||
|
// ms_info1("totalram: %lu\r\n", pSysPara->sys_info.totalram);/* 总的可用内存大小 */
|
|||
|
// ms_info1("freeram: %lu\r\n", pSysPara->sys_info.freeram);/* 还未被使用的内存大小 */
|
|||
|
// ms_info1("procs: %u\r\n", pSysPara->sys_info.procs); /* 系统当前进程数量 */
|
|||
|
|
|||
|
|
|||
|
|
|||
|
C_FSUDEVICETABLE
|
|||
|
|
|||
|
|
|||
|
//解析courses
|
|||
|
// cJSON *json_professional=cJSON_CreateObject();
|
|||
|
|
|||
|
//printfJson(json_courses); //打印测试 kooloo add 202312
|
|||
|
// cJSON *json_array = cJSON_GetArrayItem(json_courses, 49-1);
|
|||
|
|
|||
|
// printf("lenkljakhldjf %d \r\n",strlen(json_array));
|
|||
|
//printfJson(json_array);
|
|||
|
//cJSON *json_st=cJSON_CreateObject();
|
|||
|
//cJSON_AddItemToObject(json_st, "IDCodeContent", json_courses);
|
|||
|
//printfJson(json_st); //打印测试 kooloo add 202312
|
|||
|
//if (json_courses)
|
|||
|
{
|
|||
|
cJSON *json_array = cJSON_GetArrayItem(json_courses, 49-1);
|
|||
|
|
|||
|
|
|||
|
// //修改替换pSysPara->sys_info.uptime
|
|||
|
cJSON_ReplaceItemInObject(json_array, "Value", cJSON_CreateString("80"));
|
|||
|
|
|||
|
printf("lenkljakhldjf %d \r\n",strlen(json_array));
|
|||
|
printfJson(json_array);
|
|||
|
// cJSON *json_course_Value = cJSON_GetObjectItem(json_array,"Value");
|
|||
|
|
|||
|
//json_course_Value->valuedouble
|
|||
|
|
|||
|
// cJSON *json_course_Val=cJSON_CreateObject();
|
|||
|
//cJSON_AddItemToObject(json_course_Val, "name", cJSON_CreateString("milo"));
|
|||
|
|
|||
|
//更新DataArr第1元素
|
|||
|
//cJSON_ReplaceItemInArray(json_courses, 49-1, json_array);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//printfJson(json_courses); //打印测试 kooloo add 202312
|
|||
|
|
|||
|
|
|||
|
cJSON_CreateStringArray
|
|||
|
|
|||
|
|
|||
|
printf("json_Arr:\r\n");
|
|||
|
printfJson(json_Arr);
|
|||
|
|
|||
|
cJSON *json_arraydata = cJSON_GetArrayItem(json_Arr, 49-1);
|
|||
|
printf("json_arraydata:\r\n");
|
|||
|
printfJson(json_arraydata);
|
|||
|
//更新Type的值
|
|||
|
int koolotest=cJSON_ReplaceItemInObject(json_arraydata, "Value", cJSON_CreateString("char"));
|
|||
|
|
|||
|
|
|||
|
// cJSON *json_arraydjhjhj =cJSON_Duplicate(json_arraydata,1);
|
|||
|
|
|||
|
if(koolotest==0)
|
|||
|
{
|
|||
|
printf("替换失败\r\n");
|
|||
|
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
printf("替换ok\r\n");
|
|||
|
}
|
|||
|
|
|||
|
SearchName
|
|||
|
|
|||
|
// cJSON * DataArr = cJSON_GetObjectItem(json_root,"IDCodeContent");
|
|||
|
//ms_info1("cJSON_GetObjectItem DataArr\r\n"); //数据库初始化 kooloo add 202309
|
|||
|
//printfJson(DataArr); //打印测试 kooloo add 202312
|
|||
|
|
|||
|
cJSON * DataAtest=GetJson_FSUDevice_UpdateData(json_FSUSelf_root);
|
|||
|
|
|||
|
// cJSON *json_st=cJSON_CreateObject();
|
|||
|
//cJSON_AddItemToObject(json_st, "IDCodeConte0nt", DataAtest);
|
|||
|
//printfJson(json_st); //打印测试 kooloo add 202312
|
|||
|
|
|||
|
//printfJson(DataAtest); //打印测试 kooloo add 202312
|
|||
|
|
|||
|
printfJson(DataAtest); //打印测试 kooloo add 202312
|
|||
|
|
|||
|
|
|||
|
|
|||
|
g_DeviceCfg.FSUDeviceSelfTableName
|
|||
|
|
|||
|
|
|||
|
cJSON *json_root=cJSON_CreateObject();
|
|||
|
cJSON_AddItemToObject(json_root, C_JSON_FUNCCFGDEF_NUMBER, cJSON_CreateString("2"));
|
|||
|
cJSON *json_courses = cJSON_CreateArray(); //注意: courses也是一个数组, 其内部有两个对象
|
|||
|
cJSON* json_pItem1 = cJSON_CreateObject();
|
|||
|
cJSON_AddItemToObject(json_pItem1, C_JSON_FUNTYPEID, cJSON_CreateString("1"));
|
|||
|
cJSON_AddItemToObject(json_pItem1, C_JSON_FUNTYPEID_ADD, cJSON_CreateString("1"));
|
|||
|
cJSON_AddItemToArray(json_courses, json_pItem1);
|
|||
|
cJSON_AddItemToObject(json_root, C_JSON_FUNCCFGDEF, json_courses);
|
|||
|
|
|||
|
printfJson_sql(json_root);//koolootest
|
|||
|
|
|||
|
|
|||
|
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|||
|
** 函数名称: GetJson_JsonPackageData
|
|||
|
** 功能描述: 将json 封包
|
|||
|
** 参数描述:jsonarr 数组 dattype 数据类型
|
|||
|
** 日 期: 2023年9月02日
|
|||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
|||
|
cJSON * GetJson_JsonPackageData(cJSON *jsonarr,int dattype)
|
|||
|
{
|
|||
|
cJSON *json_r0t=cJSON_GetObjectItem(json_roottable, g_DeviceCfg.FSUDeviceSelfTableName); //获取表中数组; //指向根节点
|
|||
|
int tempi;
|
|||
|
|
|||
|
cJSON *json_Arr = cJSON_GetObjectItem(json_r0t, C_IDCODECONTENT); //获取表中数组
|
|||
|
//cJSON *json_Arr = cJSON_GetObjectItem(json_r0t, "FsuCode"); //获取表中数组
|
|||
|
|
|||
|
cJSON *json_rt=cJSON_GetObjectItem(json_roottable, C_GATEWAY_DATAFORMATPUBLIC); //获取表中数组; //指向根节点 获取公共表
|
|||
|
|
|||
|
ms_info1("json_r0t test %d\r\n",json_r0t->type); //数据库初始化 kooloo add 202309
|
|||
|
printfJson(json_r0t);
|
|||
|
|
|||
|
ms_info1("json_Arr test %d\r\n",json_Arr->type); //数据库初始化 kooloo add 202309
|
|||
|
printfJson(json_Arr);
|
|||
|
ms_info1("json_rt test %d\r\n",json_rt->type); //数据库初始化 kooloo add 202309
|
|||
|
printfJson(json_rt);
|
|||
|
|
|||
|
cJSON *jsonsubnode=cJSON_CreateArray();
|
|||
|
cJSON* json_pItem1 = cJSON_CreateObject();
|
|||
|
cJSON_AddItemToObject(json_pItem1,"JH", cJSON_CreateString("pResult[tempi*3]")); //添加到json表中 kooloo add 202312
|
|||
|
cJSON_AddItemToObject(json_pItem1,"pResult[1]", cJSON_CreateString("pResult[tempi*3+1]"));
|
|||
|
cJSON_AddItemToObject(json_pItem1,"pResult[2]", cJSON_CreateString("pResult[tempi*3+2]"));
|
|||
|
|
|||
|
cJSON_AddItemToArray(jsonsubnode, json_pItem1);
|
|||
|
|
|||
|
ms_info1("jsonsubnode test %d\r\n",jsonsubnode->type); //数据库初始化 kooloo add 202309
|
|||
|
printfJson(jsonsubnode);
|
|||
|
|
|||
|
tempi=cJSON_ReplaceItemInObject(json_rt, C_IDCODECONTENT, jsonsubnode);
|
|||
|
ms_info1("json_rt rep1 test %d rt =%d\r\n",json_rt->type,tempi); //数据库初始化 kooloo add 202309
|
|||
|
printfJson(json_rt);
|
|||
|
tempi=cJSON_ReplaceItemInObject(json_rt, C_IDCODECONTENT, json_Arr);
|
|||
|
|
|||
|
ms_info1("json_rt rep3 test %d rt =%d\r\n",json_rt->type,tempi); //数据库初始化 kooloo add 202309
|
|||
|
printfJson(json_rt);
|
|||
|
|
|||
|
tempi=cJSON_ReplaceItemInObject(json_rt, C_GATEWAY_DATATYPE, cJSON_CreateString("YYY"));
|
|||
|
|
|||
|
ms_info1("json_rt rep2 test %d rt =%d\r\n",json_rt->type,tempi); //数据库初始化 kooloo add 202309
|
|||
|
printfJson(json_rt);
|
|||
|
|
|||
|
//获取时间戳 kooloo add 202312 更新时间戳
|
|||
|
char strbuf[20] = {0};
|
|||
|
GetLocalTimeStr(strbuf);
|
|||
|
cJSON_ReplaceItemInObject(json_rt, C_TIMESTAMP, cJSON_CreateString(strbuf));
|
|||
|
}
|
|||
|
|
|||
|
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|||
|
** 函数名称: GetJson_JsonPackageData
|
|||
|
** 功能描述: 将json 封包
|
|||
|
** 参数描述:jsonarr 数组 dattype 数据类型
|
|||
|
** 日 期: 2023年9月02日
|
|||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
|||
|
cJSON * GetJson_JsonPackageData(cJSON *jsonarr,char *strtype)
|
|||
|
{
|
|||
|
|
|||
|
cJSON *json_rt=cJSON_GetObjectItem(json_roottable, C_GATEWAY_DATAFORMATPUBLIC); //获取表中数组; //指向根节点 获取公共表
|
|||
|
cJSON *json_arr=cJSON_CreateArray(); //临时组
|
|||
|
int tempi,size=cJSON_GetArraySize(jsonarr);
|
|||
|
|
|||
|
printf("size =%d\r\n",size);
|
|||
|
|
|||
|
for(tempi=0;tempi<size;tempi++)
|
|||
|
{
|
|||
|
cJSON *json_pItem1=cJSON_GetArrayItem(jsonarr, tempi);//获取json 数组 kooloo add 202312
|
|||
|
cJSON_AddItemToArray(json_arr, json_pItem1);
|
|||
|
printf("tempi =%d\r\n",tempi);
|
|||
|
printfJson(json_pItem1);
|
|||
|
}
|
|||
|
|
|||
|
printfJson(json_arr);
|
|||
|
cJSON_ReplaceItemInObject(json_rt, C_IDCODECONTENT, json_arr); //替换内容 kooloo add 202312
|
|||
|
//cJSON_ReplaceItemInObject(json_rt, C_IDCODECONTENT, jsonarr); //替换内容 kooloo add 202312
|
|||
|
cJSON_ReplaceItemInObject(json_rt, C_GATEWAY_DATATYPE, cJSON_CreateString(strtype)); //替换类型 kooloo add 202312
|
|||
|
|
|||
|
//获取时间戳 kooloo add 202312 更新时间戳
|
|||
|
char strbuf[20] = {0};
|
|||
|
GetLocalTimeStr(strbuf);
|
|||
|
cJSON_ReplaceItemInObject(json_rt, C_TIMESTAMP, cJSON_CreateString(strbuf));
|
|||
|
|
|||
|
return json_rt; //返回
|
|||
|
}
|
|||
|
|
|||
|
cJSON *json_r0t=cJSON_GetObjectItem(json_roottable, g_DeviceCfg.FSUDeviceSelfTableName); //获取表中数组; //指向根节点
|
|||
|
cJSON *json_Arr = cJSON_GetObjectItem(json_r0t, C_IDCODECONTENT); //获取表中数组
|
|||
|
ms_info1("GetJson_JsonPackageData test\r\n"); //数据库初始化 kooloo add 202309
|
|||
|
cJSON *cjson_kltest=GetJson_JsonPackageData(json_Arr ,0);
|
|||
|
printfJson(cjson_kltest); //打印测试 kooloo add 202312
|
|||
|
|
|||
|
//读取JSON
|
|||
|
cJSON* readJsonFile(char *fileName) {
|
|||
|
if (NULL == fileName) {
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
|
|||
|
FILE *fp = NULL;
|
|||
|
cJSON *json = NULL;
|
|||
|
char line[1024] = {0};
|
|||
|
char *data = NULL;
|
|||
|
|
|||
|
//打开一个文本文件,文件必须存在,只允许读
|
|||
|
fp = fopen(fileName, "r");
|
|||
|
if (NULL != fp) {
|
|||
|
//seek末尾
|
|||
|
fseek(fp, 0, SEEK_END);
|
|||
|
//读取文件大小
|
|||
|
long len = ftell(fp);
|
|||
|
//seek起始位值
|
|||
|
fseek(fp, 0, SEEK_SET);
|
|||
|
data = (char*)malloc(len + 1);
|
|||
|
fread(data, 1, len, fp);
|
|||
|
fclose(fp);
|
|||
|
}
|
|||
|
|
|||
|
printf("06readJsonFile data:%s\n", data);
|
|||
|
cJSON *json_root = cJSON_Parse(data);
|
|||
|
if (NULL == json_root) {
|
|||
|
printf("cJSON_Parse error:%s\n", cJSON_GetErrorPtr());
|
|||
|
}
|
|||
|
|
|||
|
if (NULL != data) {
|
|||
|
free(data);
|
|||
|
}
|
|||
|
|
|||
|
return json_root;
|
|||
|
}
|
|||
|
|
|||
|
// char *fileName = "../JsonTable/persontest.json";
|
|||
|
char *fileName = "/home/EdgeGateway_FSU_App/persontest.json";
|
|||
|
|
|||
|
|
|||
|
FILE *fp = NULL;
|
|||
|
cJSON *json = NULL;
|
|||
|
char line[1024] = {0};
|
|||
|
char *data = NULL;
|
|||
|
long datalen;
|
|||
|
//打开一个文本文件,文件必须存在,只允许读
|
|||
|
fp = fopen(fileName, "r");
|
|||
|
if (NULL != fp) {
|
|||
|
//seek末尾
|
|||
|
fseek(fp, 0, SEEK_END);
|
|||
|
//读取文件大小
|
|||
|
datalen= ftell(fp);
|
|||
|
//seek起始位值
|
|||
|
fseek(fp, 0, SEEK_SET);
|
|||
|
data = (char*)malloc(datalen + 1);
|
|||
|
fread(data, 1, datalen, fp);
|
|||
|
fclose(fp);
|
|||
|
}
|
|||
|
|
|||
|
printf("09readJsonFile data:%s\n", data);
|
|||
|
cJSON *json_root = cJSON_Parse(data);
|
|||
|
if (NULL == json_root) {
|
|||
|
printf("cJSON_Parse error:%s\n", cJSON_GetErrorPtr());
|
|||
|
}
|
|||
|
//uint8_t buf[103];
|
|||
|
//memset(data, 'A', 100);
|
|||
|
int len;
|
|||
|
len=mq_send(MqdSrcToDst, data, datalen, 0);
|
|||
|
printf("N1N%s %d\r\n", data,len);
|
|||
|
printf("N1N%d\r\n", MqdSrcToDst);
|
|||
|
|
|||
|
len=mq_send(MqdSrcToDst, data, datalen, 0);
|
|||
|
printf("N4NCCC%s %d\r\n", data,len);
|
|||
|
printf("N4NOIU%d\r\n", MqdSrcToDst);
|
|||
|
|
|||
|
|
|||
|
//koolootest
|
|||
|
len=mq_send(MqdSrcToDst, data, datalen, 0);
|
|||
|
printf("sendbuf%s return %d strlen %d\r\n", data,len,datalen);
|
|||
|
//koolootest
|
|||
|
|
|||
|
|
|||
|
#define S_SystemApp_PATH "source /test_enterapp.sh" //进入到指定目录 kooloo add 202312
|
|||
|
|
|||
|
#define S_TimeAlignedApp_NAME "TimeAlignedApp"
|
|||
|
#define S_TimeAlignedApp_KillNAME "killall TimeAlignedApp"
|
|||
|
#define S_TimeAlignedApp_PATH_EXE "./home/EdgeGateway_FSU_App/App/TimeAlignedApp &"
|
|||
|
#define S_TimeAlignedApp_ISRUNNING "ps -e -o pid,comm | grep TimeAlignedApp | grep -v PID | grep -v grep"
|
|||
|
|
|||
|
#define S_MainProcessApp_NAME "MainProcessApp"
|
|||
|
#define S_MainProcessApp_KillNAME "killall MainProcessApp"
|
|||
|
#define S_MainProcessApp_PATH_EXE "./home/EdgeGateway_FSU_App/App/MainProcessApp &"
|
|||
|
#define S_MainProcessApp_ISRUNNING "ps -e -o pid,comm | grep MainProcessApp | grep -v PID | grep -v grep"
|
|||
|
|
|||
|
#define S_MqttClientApp_NAME "MqttClientApp"
|
|||
|
#define S_MqttClientApp_KillNAME "killall MqttClientApp"
|
|||
|
#define S_MqttClientApp_PATH_EXE "./home/EdgeGateway_FSU_App/App/MqttClientApp &"
|
|||
|
#define S_MqttClientApp_ISRUNNING "ps -e -o pid,comm | grep MqttClientApp | grep -v PID | grep -v grep"
|
|||
|
|
|||
|
#define S_DevicePortGetApp_NAME "DevicePortGetApp"
|
|||
|
#define S_DevicePortGetApp_KillNAME "killall DevicePortGetApp"
|
|||
|
#define S_DevicePortGetApp_PATH_EXE "./home/EdgeGateway_FSU_App/App/DevicePortGetApp &"
|
|||
|
#define S_DevicePortGetApp_ISRUNNING "ps -e -o pid,comm | grep DevicePortGetApp | grep -v PID | grep -v grep"
|
|||
|
|
|||
|
printf("koooo %d %d\n",tFunTyID_DevCod_buf[1].DevCod,tFunTyID_DevCod_buf[2].DevCod);
|
|||
|
int i;
|
|||
|
for( i=0;i<100;i++)
|
|||
|
{
|
|||
|
printf("koooo %d %d\n",tFunTyID_DevCod_buf[i].FunTyID,tFunTyID_DevCod_buf[i].DevCod);
|
|||
|
}
|
|||
|
|
|||
|
OID_Content_t toid;
|
|||
|
toid.Status =0;
|
|||
|
//获取 表 根据检索表 kooloo add 202312
|
|||
|
char Temp_oidStrA[100]={0}; //临时变量 kooloo
|
|||
|
char Temp_oidStrB[100]={0}; //临时变量 kooloo
|
|||
|
char *ptr = NULL;
|
|||
|
ptr = strrchr(oidstr, '.'); //倒数 kooloo add 202312
|
|||
|
printf("test start %d\n",toid.Status);
|
|||
|
if(ptr==NULL)
|
|||
|
{
|
|||
|
return toid;
|
|||
|
}
|
|||
|
toid.SimilarDevSN=atoi(ptr); //获取首个值 kooloo add 202401
|
|||
|
printf("ptr 1 %s\n",ptr);
|
|||
|
printf("test %d\n",toid.SimilarDevSN);
|
|||
|
|
|||
|
strncpy(Temp_oidStrA,oidstr,(ptr-oidstr)); //将表名 添加 kooloo add 20230928
|
|||
|
printf("Temp_oidStr %s\n",Temp_oidStrA);
|
|||
|
|
|||
|
ptr = strrchr(Temp_oidStrA, '.'); //倒数 kooloo add 202312
|
|||
|
if(ptr==NULL)
|
|||
|
{
|
|||
|
return toid;
|
|||
|
}
|
|||
|
toid.SignalSN=atoi(ptr); //获取首个值 kooloo add 202401
|
|||
|
printf("ptr 2 %s\n",ptr);
|
|||
|
strncpy(Temp_oidStrB,oidstr,(ptr-Temp_oidStrA)); //将表名 添加 kooloo add 20230928
|
|||
|
printf("Temp_oidStr %s\n",Temp_oidStrB);
|
|||
|
|
|||
|
ptr = strrchr(Temp_oidStrB, '.'); //倒数 kooloo add 202312
|
|||
|
if(ptr==NULL)
|
|||
|
{
|
|||
|
return toid;
|
|||
|
}
|
|||
|
toid.SignalType=atoi(ptr); //获取首个值 kooloo add 202401
|
|||
|
printf("ptr 3 %s\n",ptr);
|
|||
|
memset(Temp_oidStrA,0,100);
|
|||
|
strncpy(Temp_oidStrA,oidstr,(ptr-Temp_oidStrB)); //将表名 添加 kooloo add 20230928
|
|||
|
printf("Temp_oidStr %s\n",Temp_oidStrA);
|
|||
|
|
|||
|
ptr = strrchr(Temp_oidStrA, '.'); //倒数 kooloo add 202312
|
|||
|
if(ptr==NULL)
|
|||
|
{
|
|||
|
return toid;
|
|||
|
}
|
|||
|
toid.SignalSN=atoi(ptr); //获取首个值 kooloo add 202401
|
|||
|
printf("ptr 2 %s\n",ptr);
|
|||
|
strncpy(Temp_oidStrB,oidstr,(ptr-Temp_oidStrA)); //将表名 添加 kooloo add 20230928
|
|||
|
printf("Temp_oidStr %s\n",Temp_oidStrB);
|
|||
|
|
|||
|
OID_Content_t testk=GetTyidadd_fromoidstr(".1.3.6.1.4.1.61262.4.98.1.2.1");
|
|||
|
printf("DevType %d\n",testk.DevType);
|
|||
|
while(1)
|
|||
|
{
|
|||
|
sleep(1);
|
|||
|
}
|
|||
|
|
|||
|
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|||
|
** 函数名称: UART_Init
|
|||
|
** 功能描述: 串口初始化
|
|||
|
** 参数描述: 无
|
|||
|
** 作 者: kooloo
|
|||
|
** 日 期: 2022年03月21
|
|||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
|||
|
void UART_Init(void)
|
|||
|
{
|
|||
|
int Tempi,Tempj;
|
|||
|
int TempTypeID;
|
|||
|
for(Tempi=0;Tempi<eSDPort_Number_Max;Tempi++) //首次初始化 则先初始化第一个设备 kooloo add 20230928
|
|||
|
{
|
|||
|
TempTypeID =g_CfgTab_Rs485_Gather.g_SDPortFuncDef[Tempi].g_DeviceFuncDef[g_CfgTab_Rs485_Gather.g_SDPortFuncDef[Tempi].TypeIndex].FunctionConfigTypeID;
|
|||
|
ms_info1("PortID:%d,TypeID:%d\n",Tempi,TempTypeID); //数据库初始化 kooloo add 202309
|
|||
|
if(Port_BindingFuncTypeID_FuncBuf[TempTypeID][eBFuncTID_Init]!=NULL)
|
|||
|
{
|
|||
|
Port_BindingFuncTypeID_FuncBuf[TempTypeID][eBFuncTID_Init](Tempi);
|
|||
|
}
|
|||
|
if(TempTypeID==C_HJWL_SERIALPORT_VPORT_TYID) //如果为透传接口 则同步初始化 其他透传口 kooloo add 20240201
|
|||
|
{
|
|||
|
CfgTab_SmartDevicePortFuncDef_t *SDP;
|
|||
|
CfgTab_SmartDevicePortFuncDef_t *SDPsrc=&g_CfgTab_Rs485_Gather.g_SDPortFuncDef[Tempi];
|
|||
|
for(Tempj=0;Tempj<eVirtuallyPort_Number_Max;Tempj++) //首次初始化 则先初始化第一个设备 kooloo add 20230928
|
|||
|
{
|
|||
|
SDP=&g_CfgTab_Rs485_Gather.g_SDPortFuncDef[Tempj+eSDPort_Number_Max];
|
|||
|
SDP->fd=SDPsrc->fd;
|
|||
|
SDP->ctx=SDPsrc->ctx;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
Uint32 u32un;
|
|||
|
u32un.DatBuf[0]=0x00;
|
|||
|
u32un.DatBuf[1]=0xD7;
|
|||
|
u32un.DatBuf[2]=0x47;
|
|||
|
u32un.DatBuf[3]=0x42;
|
|||
|
printf(" test %4X 0x4247D700\n",u32un.U32);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if((g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].g_DeviceFuncDef[g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send].PollArrIndexNow_Send+1)<
|
|||
|
g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].g_DeviceFuncDef[g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send].PollArrNumber
|
|||
|
) //如果小于 则需要进行下一个地址轮询 kooloo add 202310
|
|||
|
{
|
|||
|
g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].g_DeviceFuncDef[g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send].PollArrIndexNow_Send++;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].g_DeviceFuncDef[g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send].PollArrIndexNow_Send=0;
|
|||
|
|
|||
|
if((g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send+1)<g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send)
|
|||
|
{
|
|||
|
g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send++;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send=0; //从头开始轮询 同设备 kooloo add 202310
|
|||
|
}
|
|||
|
}
|
|||
|
i_dex=g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].g_DeviceFuncDef[g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send].PollArrIndexNow_Send;
|
|||
|
i_id =g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].g_DeviceFuncDef[g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send].FunctionConfigTypeID;
|
|||
|
|
|||
|
if(portnum<(eSDPort_Number_Max+eVirtuallyPort_Number_Max-1)) //根据端口数量
|
|||
|
{
|
|||
|
portnum++;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
portnum=0;
|
|||
|
}
|
|||
|
|
|||
|
if(i_id&&(i_id!=C_HJWL_SERIALPORT_VPORT_TYID))
|
|||
|
{
|
|||
|
mq_sendJson_subdevfromID(i_id,i_dex); //根据ID和轮询号发送数据 kooloo add 202312
|
|||
|
pSysPara->g_SendSubDevData_TimeCnt=Timer_getNowTicks();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
printf("SendData Test %d\n",eSDPort_Number_Max+eVirtuallyPort_Number_Max-1);
|
|||
|
for(portnum=0;portnum<(eSDPort_Number_Max+eVirtuallyPort_Number_Max-1);portnum++) //根据端口数量 虚拟端口
|
|||
|
{
|
|||
|
printf("SendData portnum %d Tnum %d\n",portnum,g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeNumber);
|
|||
|
ms_info1("portnum %d poll ID... num %d \n", portnum,g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeNumber);
|
|||
|
for(TempTypeIndex=0;(TempTypeIndex)<g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeNumber;TempTypeIndex++)
|
|||
|
{
|
|||
|
//获取ID
|
|||
|
i_id =g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].g_DeviceFuncDef[TempTypeIndex].FunctionConfigTypeID;
|
|||
|
if(Port_BindingFuncTypeID_FuncBuf[i_id][eBFuncTID_ServiceLoop]!=NULL)
|
|||
|
{
|
|||
|
printf("SendData Test2 %d i_id%d\n",TempTypeIndex,i_id);
|
|||
|
if(i_id&&(i_id!=C_HJWL_SERIALPORT_VPORT_TYID))
|
|||
|
{
|
|||
|
ms_info1("SendData PortID %d TypeID %d, Index %d\n",portnum,i_id,TempTypeIndex);
|
|||
|
for(TempPollArrIndexNow=0;(TempPollArrIndexNow)<g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].g_DeviceFuncDef[TempTypeIndex].PollArrNumber;TempPollArrIndexNow++)
|
|||
|
{
|
|||
|
if(i_id&&(i_id!=C_HJWL_SERIALPORT_VPORT_TYID))
|
|||
|
{
|
|||
|
mq_sendJson_subdevfromID(i_id,i_dex); //根据ID和轮询号发送数据 kooloo add 202312
|
|||
|
printf("SendData PortID %d TypeID %d, Index %d polli %d\n",portnum,i_id,TempTypeIndex,TempPollArrIndexNow);
|
|||
|
sleep(1);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
// /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|||
|
// ** 函数名称: UART_Init
|
|||
|
// ** 功能描述: 异步I/O初始化函数
|
|||
|
// ** 参数描述: 无
|
|||
|
// ** 作 者: kooloo
|
|||
|
// ** 日 期: 2022年03月21
|
|||
|
// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
|||
|
// static void async_io_init(void)
|
|||
|
// {
|
|||
|
// struct sigaction sigatn;
|
|||
|
// int flag;
|
|||
|
// int fd; //koolootest
|
|||
|
|
|||
|
// /* 使能异步I/O */
|
|||
|
// flag = fcntl(fd, F_GETFL); //使能串口的异步I/O功能
|
|||
|
// flag |= O_ASYNC;
|
|||
|
// fcntl(fd, F_SETFL, flag);
|
|||
|
|
|||
|
// /* 设置异步I/O的所有者 */
|
|||
|
// fcntl(fd, F_SETOWN, getpid());
|
|||
|
|
|||
|
// /* 指定实时信号SIGRTMIN作为异步I/O通知信号 */
|
|||
|
// fcntl(fd, F_SETSIG, SIGRTMIN);
|
|||
|
|
|||
|
// /* 为实时信号SIGRTMIN注册信号处理函数 */
|
|||
|
// //sigatn.sa_sigaction = io_handler; //当串口有数据可读时,会跳转到io_handler函数
|
|||
|
// sigatn.sa_flags = SA_SIGINFO;
|
|||
|
// sigemptyset(&sigatn.sa_mask);
|
|||
|
// sigaction(SIGRTMIN, &sigatn, NULL);
|
|||
|
// }
|
|||
|
|
|||
|
// /**
|
|||
|
// ** 信号处理函数,当串口有数据可读时,会跳转到该函数执行
|
|||
|
// **/
|
|||
|
// static void io_handler(int sig, siginfo_t *info, void *context)
|
|||
|
// {
|
|||
|
// unsigned char buf[10] = {0};
|
|||
|
// int ret;
|
|||
|
// int n;
|
|||
|
// int fd; //koolootest
|
|||
|
|
|||
|
// if(SIGRTMIN != sig)
|
|||
|
// return;
|
|||
|
|
|||
|
// /* 判断串口是否有数据可读 */
|
|||
|
// if (POLL_IN == info->si_code) {
|
|||
|
// ret = read(fd, buf, 8); //一次最多读8个字节数据
|
|||
|
// printf("[ ");
|
|||
|
// for (n = 0; n < ret; n++)
|
|||
|
// printf("0x%hhx ", buf[n]);
|
|||
|
// printf("]\n");
|
|||
|
// }
|
|||
|
// }
|
|||
|
|
|||
|
|
|||
|
测试使用
|
|||
|
|
|||
|
Uint_bit_flag Uint_bit;
|
|||
|
char strbuf[20] = {0}; //临时用变量 转换用
|
|||
|
Uint_bit.byte=0;
|
|||
|
unsigned short aaa=0xFFFFFFFFF;
|
|||
|
printf("short %d\n",aaa);
|
|||
|
|
|||
|
|
|||
|
sprintf(strbuf, "%d", Uint_bit.bits.bit0);
|
|||
|
|
|||
|
printf("str %s %d %d \n",strbuf,Uint_bit.byte,Uint_bit.bits.bit0);
|
|||
|
|
|||
|
Uint_bit.bits.bit0=1;
|
|||
|
sprintf(strbuf, "%d", (int)Uint_bit.bits.bit0);
|
|||
|
printf("str %s %d %d \n",strbuf,Uint_bit.byte,(int)Uint_bit.bits.bit0);
|
|||
|
|
|||
|
Uint_bit.byte=1;
|
|||
|
sprintf(strbuf, "%d", Uint_bit.bits.bit0);
|
|||
|
|
|||
|
printf("str %s %d %d \n",strbuf,Uint_bit.byte,(unsigned int)Uint_bit.bits.bit0);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Uint16 Uintstrut;
|
|||
|
Uintstrut.Uint16=0x11;
|
|||
|
sprintf(strbuf, "%d", Uintstrut.Uint16&0xFF);
|
|||
|
printf("str %s %d \n",strbuf,Uintstrut.Uint16);
|
|||
|
|
|||
|
|
|||
|
return 0;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
extern int (*Port_BindingFuncTypeID_FuncBuf[eFCT_DeviceNumber_Max][eFCT_FuncNumber_Max])(int PortID);
|
|||
|
|
|||
|
if(Port_BindingFuncTypeID_FuncBuf[0][0]==NULL)
|
|||
|
{
|
|||
|
printf("Port_BindingFuncTypeID_FuncBuf[0][0](0); 执行前\n");
|
|||
|
sleep(1);
|
|||
|
Port_BindingFuncTypeID_FuncBuf[0][0](0);
|
|||
|
printf("Port_BindingFuncTypeID_FuncBuf[0][0](0); 执行后\n");
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************
|
|||
|
Copyright © huijue Network Co., Ltd. 1998-2129. All rights reserved.
|
|||
|
Copyright © 上海汇珏网络通信设备股份有限公司 1998-2129. All rights reserved.
|
|||
|
文件名 : slavePoll.c
|
|||
|
作者 : kooloo
|
|||
|
版本 : V1.0
|
|||
|
描述 : 动环监控/边缘网关FSU RS485接口监测轮询
|
|||
|
硬件平台 : iMX6ULL
|
|||
|
内核版本 : linux-imx-4.1.15-2.1.0-g3dc0a4b-v2.7
|
|||
|
编译器版本 :gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf
|
|||
|
日志 : 初版V1.0 2023/7/15 kooloo创建
|
|||
|
***************************************************************/
|
|||
|
#include <stdio.h>
|
|||
|
#include <unistd.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <string.h>
|
|||
|
#include <time.h>
|
|||
|
#include "public.h"
|
|||
|
#include "modbus.h"
|
|||
|
#include <fcntl.h>
|
|||
|
#include <errno.h>
|
|||
|
#include <sys/time.h>
|
|||
|
|
|||
|
#include <FuncConfigTypeID_Public.h> //功能函数定义相关函数 kooloo add 20230922
|
|||
|
#include "mslog.h"
|
|||
|
|
|||
|
#if 1 //方便折叠 kooloo add 2023
|
|||
|
static const int RS485_idx[eSDPort_Number_Max]={0,1,2,3,4,5,6,7};
|
|||
|
static const int RS485_idx_non=8;
|
|||
|
static void pollThreadcreate(void);
|
|||
|
extern void mbPollUartTreat(uint8_t idx);
|
|||
|
|
|||
|
extern void non_mbPollUartTreat(uint8_t idx);
|
|||
|
#endif
|
|||
|
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|||
|
** 函数名称: slavePollThread
|
|||
|
** 功能描述: 动环监控从设备轮询线程
|
|||
|
** 参数描述: 无
|
|||
|
** 作 者: kooloo
|
|||
|
** 日 期: 2022年03月21
|
|||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
|||
|
void * slavePollThread(void *arg)
|
|||
|
{
|
|||
|
ms_info1("pollThreadcreate\n"); //创建轮询主线程 kooloo add 202309
|
|||
|
pollThreadcreate(); //子线程创建 kooloo add 202309
|
|||
|
sleep(10); //正常不会进入此
|
|||
|
return 0;
|
|||
|
}
|
|||
|
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|||
|
** 函数名称: mbPollThread
|
|||
|
** 功能描述: 标准modbus接口轮询线程 全部以标准Modbus接口创建线程 内部会根据数据库定义其数据
|
|||
|
** 参数描述: 无
|
|||
|
** 作 者: kooloo
|
|||
|
** 日 期: 2022年03月21
|
|||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
|||
|
void * mbPollThread(void *arg)
|
|||
|
{
|
|||
|
uint8_t num=*(uint8_t *)arg;
|
|||
|
|
|||
|
ms_info1("RS485 PORT %d CREATE \n",num);
|
|||
|
if(num<eSDPort_Number_Max)
|
|||
|
{
|
|||
|
mbPollUartTreat(num); //modbus串口处理
|
|||
|
}
|
|||
|
ms_info1("no data create to poll ,so RS485 PORT %d thread EXIT \n",num);
|
|||
|
pthread_exit((void *)0);
|
|||
|
}
|
|||
|
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|||
|
** 函数名称: non_mbPollThread
|
|||
|
** 功能描述: 非标设备轮询线程
|
|||
|
** 参数描述:
|
|||
|
** 作 者: kooloo
|
|||
|
** 日 期: 2022年03月21
|
|||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
|||
|
void * non_mbPollThread(void *arg)
|
|||
|
{
|
|||
|
int num=*(int *)arg;
|
|||
|
ms_info1("Non-std PORT %d CREATE\n",num);
|
|||
|
non_mbPollUartTreat(num);
|
|||
|
ms_info1("no data create to Non-std poll ,so RS485 PORT %d thread EXIT \n",num);
|
|||
|
pthread_exit((void *)0);
|
|||
|
}
|
|||
|
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|||
|
** 函数名称: pollThreadcreate
|
|||
|
** 功能描述: 标准modbus接口轮询线程 全部以标准Modbus接口创建线程 内部会根据数据库定义
|
|||
|
** 参数描述: 无
|
|||
|
** 作 者: kooloo
|
|||
|
** 日 期: 2022年03月21
|
|||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
|||
|
static void pollThreadcreate(void)
|
|||
|
{
|
|||
|
int Tempi;
|
|||
|
void *retval;
|
|||
|
pthread_t thr[eSDPort_Number_Max];
|
|||
|
pthread_t non_thr;
|
|||
|
if(pthread_create(&non_thr, NULL, non_mbPollThread, (void *)&RS485_idx_non)!=0)
|
|||
|
{
|
|||
|
ms_error1("create non thread 8 failed1\n");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
for(Tempi=0;Tempi<eSDPort_Number_Max;Tempi++) //6个modbus接口轮询线程
|
|||
|
{
|
|||
|
if(pthread_create(&thr[Tempi], NULL, mbPollThread, (void *)&RS485_idx[Tempi])!=0)
|
|||
|
{
|
|||
|
ms_error1("create thread %d failed!\n",Tempi);
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
for(Tempi=0;Tempi<eSDPort_Number_Max;Tempi++) //等待线程 kooloo add 202309
|
|||
|
{
|
|||
|
pthread_join(thr[Tempi], &retval);
|
|||
|
}
|
|||
|
pthread_join(non_thr, &retval);
|
|||
|
}
|
|||
|
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|||
|
** 函数名称: mbPollUartTreat
|
|||
|
** 功能描述: modbus设备轮询及数据处理
|
|||
|
** 参数描述: idx 串口设备("/dev/ttymxc2")
|
|||
|
** 作 者: kooloo
|
|||
|
** 日 期: 2022年03月21
|
|||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
|||
|
void mbPollUartTreat(uint8_t idx)
|
|||
|
{
|
|||
|
struct timespec NanoSleepTime_t={C_PTHREAD_SLEEPTIME_TV_SEC,C_PTHREAD_SLEEPTIME_TV_NSEC};
|
|||
|
int DbgTime[eSDPort_Number_Max];
|
|||
|
|
|||
|
int TempTypeID =g_CfgTab_Rs485_Gather.g_SDPortFuncDef[idx].g_DeviceFuncDef[g_CfgTab_Rs485_Gather.g_SDPortFuncDef[idx].TypeIndex].FunctionConfigTypeID;
|
|||
|
//uint8_t MqmsgbufVp[C_SERIALPORT_MQ_MSGSIZE];
|
|||
|
Dev_TransmitCmd_t tDev_TCmd;
|
|||
|
tDev_TCmd.Rxbuf= (char*)malloc(C_SERIALPORT_MQ_MSGSIZE);
|
|||
|
memset(tDev_TCmd.Rxbuf, 0, C_SERIALPORT_MQ_MSGSIZE);
|
|||
|
int MqmsglenSp;
|
|||
|
while(1)
|
|||
|
{
|
|||
|
MqmsglenSp = mq_receive(MqdSerialPort, &tDev_TCmd, C_SERIALPORT_MQ_MSGSIZE, NULL);
|
|||
|
if (MqmsglenSp > 0)
|
|||
|
{
|
|||
|
if(Port_BindingFuncTypeID_FuncBuf[tDev_TCmd.TyID][eBFuncTID_Fast_SetCtrlHandleFunc]!=NULL)
|
|||
|
{
|
|||
|
Port_BindingFuncTypeID_FuncBuf[tDev_TCmd.TyID][eBFuncTID_Fast_SetCtrlHandleFunc](&tDev_TCmd);
|
|||
|
}
|
|||
|
printf("Rxcmd: ID:%d Data:%s Len:%d\n",tDev_TCmd.TyID, tDev_TCmd.Rxbuf, MqmsglenSp);
|
|||
|
}
|
|||
|
#if 1 //调试信息打印
|
|||
|
if(DbgTime[idx]<C_PTHREAD_DBG_TIME_NUMBER)
|
|||
|
{
|
|||
|
DbgTime[idx]++;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
DbgTime[idx]=0;
|
|||
|
ms_info1("mb port %d poll...\n", idx);
|
|||
|
}
|
|||
|
#endif
|
|||
|
if(Port_BindingFuncTypeID_FuncBuf[TempTypeID][eBFuncTID_ServiceLoop]!=NULL)
|
|||
|
{
|
|||
|
if(Port_BindingFuncTypeID_FuncBuf[TempTypeID][eBFuncTID_ServiceLoop](idx)==eEndOfRoundFlag_ok) //如果同地址数据读取完毕 则进行下一个数据读取 kooloo add 202310
|
|||
|
{
|
|||
|
if((g_CfgTab_Rs485_Gather.g_SDPortFuncDef[idx].TypeIndex+1)<g_CfgTab_Rs485_Gather.g_SDPortFuncDef[idx].TypeNumber)
|
|||
|
{
|
|||
|
g_CfgTab_Rs485_Gather.g_SDPortFuncDef[idx].TypeIndex++;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
g_CfgTab_Rs485_Gather.g_SDPortFuncDef[idx].TypeIndex=0; //从头开始轮询 同设备 kooloo add 202310
|
|||
|
}
|
|||
|
TempTypeID =g_CfgTab_Rs485_Gather.g_SDPortFuncDef[idx].g_DeviceFuncDef[g_CfgTab_Rs485_Gather.g_SDPortFuncDef[idx].TypeIndex].FunctionConfigTypeID;
|
|||
|
if(Port_BindingFuncTypeID_FuncBuf[TempTypeID][eBFuncTID_Init]!=NULL)
|
|||
|
{
|
|||
|
//Port_BindingFuncTypeID_FuncBuf[TempTypeID][eBFuncTID_Init](idx);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
ms_info1("PortID %d TypeID %d, Index %d\n",idx,TempTypeID,g_CfgTab_Rs485_Gather.g_SDPortFuncDef[idx].TypeIndex);
|
|||
|
}
|
|||
|
sleep(3);
|
|||
|
nanosleep(&NanoSleepTime_t, NULL);
|
|||
|
}
|
|||
|
|
|||
|
if(Port_BindingFuncTypeID_FuncBuf[TempTypeID][eBFuncTID_ResRelease]!=NULL)
|
|||
|
{
|
|||
|
Port_BindingFuncTypeID_FuncBuf[TempTypeID][eBFuncTID_ResRelease](idx);
|
|||
|
ms_info1("PortID Res Release %d \n",idx);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|||
|
** 函数名称: non_mbPollUartTreat
|
|||
|
** 功能描述: 非标准 modbus设备轮询及数据处理 注意这里是非标准口
|
|||
|
** 参数描述: idx 串口设备("/dev/ttymxc2")
|
|||
|
** 作 者: kooloo
|
|||
|
** 日 期: 2022年03月21
|
|||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
|||
|
void non_mbPollUartTreat(uint8_t idx)
|
|||
|
{
|
|||
|
ms_info1("non_mbPollUartTreat Thread\n"); //创建轮询主线程 kooloo add 202309 虚拟串口主线程
|
|||
|
ms_info1("Non-std poll... %d\n",idx);
|
|||
|
int nonDbgTime[eVirtuallyPort_Number_Max];
|
|||
|
int Vportnum=eSDPort_Number_Max;
|
|||
|
g_CfgTab_Rs485_Gather.g_SDPortFuncDef[Vportnum].TypeIndex=0;
|
|||
|
int TempTypeID =g_CfgTab_Rs485_Gather.g_SDPortFuncDef[Vportnum].g_DeviceFuncDef[g_CfgTab_Rs485_Gather.g_SDPortFuncDef[Vportnum].TypeIndex].FunctionConfigTypeID;
|
|||
|
|
|||
|
//uint8_t MqmsgbufVp[C_SERIALPORT_MQ_MSGSIZE];
|
|||
|
Dev_TransmitCmd_t tDev_TCmd;
|
|||
|
tDev_TCmd.Rxbuf= (char*)malloc(C_SERIALPORT_MQ_MSGSIZE);
|
|||
|
memset(tDev_TCmd.Rxbuf, 0, C_SERIALPORT_MQ_MSGSIZE);
|
|||
|
int MqmsglenSp;
|
|||
|
while(1)
|
|||
|
{
|
|||
|
MqmsglenSp = mq_receive(MqdSerialPort, &tDev_TCmd, C_SERIALPORT_MQ_MSGSIZE, NULL);
|
|||
|
if (MqmsglenSp > 0)
|
|||
|
{
|
|||
|
if(Port_BindingFuncTypeID_FuncBuf[tDev_TCmd.TyID][eBFuncTID_Fast_SetCtrlHandleFunc]!=NULL)
|
|||
|
{
|
|||
|
Port_BindingFuncTypeID_FuncBuf[tDev_TCmd.TyID][eBFuncTID_Fast_SetCtrlHandleFunc](&tDev_TCmd);
|
|||
|
}
|
|||
|
printf("Rxcmd: ID:%d Data:%s Len:%d\n",tDev_TCmd.TyID, tDev_TCmd.Rxbuf, MqmsglenSp);
|
|||
|
}
|
|||
|
#if 1 //调试信息打印
|
|||
|
if(nonDbgTime[Vportnum-eSDPort_Number_Max]<C_PTHREAD_DBG_TIME_NUMBER)
|
|||
|
{
|
|||
|
nonDbgTime[Vportnum-eSDPort_Number_Max]++;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
nonDbgTime[Vportnum-eSDPort_Number_Max]=0;
|
|||
|
ms_info1("non Vport %d poll...\n", Vportnum-eSDPort_Number_Max);
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
for(Vportnum=eSDPort_Number_Max;Vportnum<(eSDPort_Number_Max+eVirtuallyPort_Number_Max-1);Vportnum++) //根据端口数量 虚拟端口
|
|||
|
{
|
|||
|
//Vportnum=eSDPort_Number_Max; //koolootest
|
|||
|
for(g_CfgTab_Rs485_Gather.g_SDPortFuncDef[Vportnum].TypeIndex=0;(g_CfgTab_Rs485_Gather.g_SDPortFuncDef[Vportnum].TypeIndex)<g_CfgTab_Rs485_Gather.g_SDPortFuncDef[Vportnum].TypeNumber;
|
|||
|
g_CfgTab_Rs485_Gather.g_SDPortFuncDef[Vportnum].TypeIndex++)
|
|||
|
{
|
|||
|
//g_CfgTab_Rs485_Gather.g_SDPortFuncDef[Vportnum].TypeIndex=0;//koolootest
|
|||
|
TempTypeID =g_CfgTab_Rs485_Gather.g_SDPortFuncDef[Vportnum].g_DeviceFuncDef[g_CfgTab_Rs485_Gather.g_SDPortFuncDef[Vportnum].TypeIndex].FunctionConfigTypeID;
|
|||
|
|
|||
|
if(Port_BindingFuncTypeID_FuncBuf[TempTypeID][eBFuncTID_ServiceLoop]!=NULL)
|
|||
|
{
|
|||
|
if(Port_BindingFuncTypeID_FuncBuf[TempTypeID][eBFuncTID_ServiceLoop](Vportnum)==eEndOfRoundFlag_ok) //如果同地址数据读取完毕 则进行下一个数据读取 kooloo add 202310
|
|||
|
{
|
|||
|
if(Port_BindingFuncTypeID_FuncBuf[TempTypeID][eBFuncTID_Init]!=NULL)
|
|||
|
{
|
|||
|
//Port_BindingFuncTypeID_FuncBuf[TempTypeID][eBFuncTID_Init](Vportnum);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
ms_info1("PortID %d TypeID %d, Index %d\n",Vportnum,TempTypeID,g_CfgTab_Rs485_Gather.g_SDPortFuncDef[Vportnum].TypeIndex);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
}
|
|||
|
ms_info1("non Vport %d poll... num %d \n", Vportnum-eSDPort_Number_Max,g_CfgTab_Rs485_Gather.g_SDPortFuncDef[Vportnum].TypeNumber);
|
|||
|
}
|
|||
|
sleep(3);
|
|||
|
}
|
|||
|
}
|
|||
|
//cJSON_ReplaceItemInObject(json_rt, C_GATEWAY_DATATYPE, cJSON_CreateString(C_GATEWAY_WRITEDATA));
|
|||
|
//mq_sendJson(json_rt); //将遥*数据发送 kooloo add 202312
|
|||
|
Dev_TransmitCmd_t tDev_TCmd;
|
|||
|
tDev_TCmd.TyID=tyid;
|
|||
|
tDev_TCmd.Rxbuf = (char*)malloc(C_SERIALPORT_MQ_MSGSIZE);
|
|||
|
memset(tDev_TCmd.Rxbuf, 0, C_SERIALPORT_MQ_MSGSIZE);
|
|||
|
strncpy(tDev_TCmd.Rxbuf, msgbuf, C_SERIALPORT_MQ_MSGSIZE); //将数据拷贝 kooloo add 202401
|
|||
|
if(tFunTyID_DevCod_buf[tyid].PortID<eSDPort_Number_Max) //如果为普通串口 则将消息传递到 普通串口队列中,否则传到虚拟串口中 kooloo add 20240312
|
|||
|
{
|
|||
|
len = mq_send(MqdSerialPort, (const char * )&tDev_TCmd, strlen(tDev_TCmd.Rxbuf)+sizeof(int), 0);
|
|||
|
printf("MqdSerialPort:type :%d jsonlen %d json:%s,sendlen:%d\n",oid.SignalType, strlen(tDev_TCmd.Rxbuf)+sizeof(int), tDev_TCmd.Rxbuf, len);
|
|||
|
}
|
|||
|
else if(tFunTyID_DevCod_buf[tyid].PortID<(eSDPort_Number_Max+eVirtuallyPort_Number_Max)) //虚拟串口 kooloo add 20240312
|
|||
|
{
|
|||
|
len = mq_send(MqdVtSerialPort, (const char * )&tDev_TCmd, strlen(tDev_TCmd.Rxbuf)+sizeof(int), 0);
|
|||
|
printf("MqdVtSerialPort:type :%d jsonlen %d json:%s,sendlen:%d\n",oid.SignalType, strlen(tDev_TCmd.Rxbuf)+sizeof(int), tDev_TCmd.Rxbuf, len);
|
|||
|
}
|
|||
|
free(tDev_TCmd.Rxbuf); //用完释放 kooloo add 202401
|
|||
|
//mq_sendRerJson_subdevfromID(tyid, oid.SimilarDevSN - 1);
|
|||
|
//ms_info1("type :%d cjson:%s,Rxlen:%d\n",oid.SignalType,tmsgbuf, strlen(tmsgbuf));
|
|||
|
}
|
|||
|
else if (!strcmp(C_SERVER_ALARMDATA, json_Type->valuestring)) //如果接收到的消息是FSUCODE 正确 则将消息转发 否则忽略 遥信 不需要调整
|
|||
|
{
|
|||
|
mq_sendResJson_subdevfromID(tyid, oid.SimilarDevSN - 1);
|
|||
|
ms_info1("type :%d cjson:%s,Rxlen:%d\n",oid.SignalType,tmsgbuf, strlen(tmsgbuf));
|
|||
|
}
|
|||
|
else if (!strcmp(C_SERVER_CRTLDATA, json_Type->valuestring)) //如果接收到的消息是FSUCODE 正确 则将消息转发 否则忽略 遥控 更新数据
|
|||
|
{
|
|||
|
//cJSON_ReplaceItemInObject(json_rt, C_GATEWAY_DATATYPE, cJSON_CreateString(C_GATEWAY_CTRLDATA));
|
|||
|
//mq_sendJson(json_rt); //将遥*数据发送 kooloo add 202312
|
|||
|
|
|||
|
Dev_TransmitCmd_t tDev_TCmd;
|
|||
|
tDev_TCmd.TyID=tyid;
|
|||
|
tDev_TCmd.Rxbuf = (char*)malloc(C_SERIALPORT_MQ_MSGSIZE);
|
|||
|
memset(tDev_TCmd.Rxbuf, 0, C_SERIALPORT_MQ_MSGSIZE);
|
|||
|
strncpy(tDev_TCmd.Rxbuf, msgbuf, C_SERIALPORT_MQ_MSGSIZE); //将数据拷贝 kooloo add 202401
|
|||
|
if(tFunTyID_DevCod_buf[tyid].PortID<eSDPort_Number_Max) //如果为普通串口 则将消息传递到 普通串口队列中,否则传到虚拟串口中 kooloo add 20240312
|
|||
|
{
|
|||
|
len = mq_send(MqdSerialPort, (const char * )&tDev_TCmd, strlen(tDev_TCmd.Rxbuf)+sizeof(int), 0);
|
|||
|
printf("MqdSerialPort:type :%d jsonlen %d json:%s,sendlen:%d\n",oid.SignalType, strlen(tDev_TCmd.Rxbuf)+sizeof(int), tDev_TCmd.Rxbuf, len);
|
|||
|
}
|
|||
|
else if(tFunTyID_DevCod_buf[tyid].PortID<(eSDPort_Number_Max+eVirtuallyPort_Number_Max)) //虚拟串口 kooloo add 20240312
|
|||
|
{
|
|||
|
len = mq_send(MqdVtSerialPort, (const char * )&tDev_TCmd, strlen(tDev_TCmd.Rxbuf)+sizeof(int), 0);
|
|||
|
printf("MqdVtSerialPort:type :%d jsonlen %d json:%s,sendlen:%d\n",oid.SignalType, strlen(tDev_TCmd.Rxbuf)+sizeof(int), tDev_TCmd.Rxbuf, len);
|
|||
|
}
|
|||
|
free(tDev_TCmd.Rxbuf); //用完释放 kooloo add 202401
|
|||
|
//mq_sendRecJson_subdevfromID(tyid, oid.SimilarDevSN - 1);
|
|||
|
//ms_info1("type :%d cjson:%s,Rxlen:%d\n",oid.SignalType,tmsgbuf, strlen(tmsgbuf));
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//cJSON_ReplaceItemInObject(json_rt, C_GATEWAY_DATATYPE, cJSON_CreateString(C_GATEWAY_WRITEDATA));
|
|||
|
//mq_sendJson(json_rt); //将遥*数据发送 kooloo add 202312
|
|||
|
char* tmsgbuf_spvp = (char*)malloc(C_SERIALPORT_MQ_MSGSIZE);
|
|||
|
memset(tmsgbuf_spvp, 0, C_SERIALPORT_MQ_MSGSIZE);
|
|||
|
strncpy(tmsgbuf_spvp, msgbuf, C_SERIALPORT_MQ_MSGSIZE); //将数据拷贝 kooloo add 202401
|
|||
|
if(tFunTyID_DevCod_buf[tyid].PortID<eSDPort_Number_Max) //如果为普通串口 则将消息传递到 普通串口队列中,否则传到虚拟串口中 kooloo add 20240312
|
|||
|
{
|
|||
|
len = mq_send(MqdSerialPort, tmsgbuf_spvp, strlen(tmsgbuf_spvp), 0);
|
|||
|
printf("MqdSerialPort:type :%d jsonlen %d json:%s,sendlen:%d\n",oid.SignalType, strlen(tmsgbuf_spvp), tmsgbuf_spvp, len);
|
|||
|
}
|
|||
|
else if(tFunTyID_DevCod_buf[tyid].PortID<(eSDPort_Number_Max+eVirtuallyPort_Number_Max)) //虚拟串口 kooloo add 20240312
|
|||
|
{
|
|||
|
len = mq_send(MqdVtSerialPort, tmsgbuf_spvp, strlen(tmsgbuf_spvp), 0);
|
|||
|
printf("MqdVtSerialPort:type :%d jsonlen %d json:%s,sendlen:%d\n",oid.SignalType, strlen(tmsgbuf_spvp), tmsgbuf_spvp, len);
|
|||
|
}
|
|||
|
free(tmsgbuf_spvp); //用完释放 kooloo add 202401
|
|||
|
//mq_sendRerJson_subdevfromID(tyid, oid.SimilarDevSN - 1);
|
|||
|
//ms_info1("type :%d cjson:%s,Rxlen:%d\n",oid.SignalType,tmsgbuf, strlen(tmsgbuf));
|