void* publisher_thread(thread_args_t *thread_args) { int pub_index = thread_args -> user_index; benchmark_t *setup = thread_args -> setup; char *time_str = NULL, *random_message = NULL, *event_node; mio_stanza_t *item; mio_conn_t *conn = publishers[pub_index]; if (conn == NULL) printf("conn is null %d\n", pub_index); // generate random message random_message = malloc(sizeof(char)* 1000); memset(random_message,0x41,1000); random_message[999]='\0'; int node_index; mio_response_t *response; while(TRUE) { for ( node_index = 0; node_index < setup -> publish_factor; node_index++) { event_node = publish_nodes[pub_index][node_index]; time_str = mio_timestamp_create(); item = mio_pubsub_item_data_new(conn); mio_item_transducer_value_add(item, "name", "100", random_message, random_message,time_str); response = mio_response_new(); mio_item_publish(conn, item, event_node,response); free(time_str); free(response); mio_stanza_free(item); publish_count[pub_index][node_index]++; } } return (void*) NULL; }
int publish_data(adapter_t *adapter) { static uint8_t rx_buf[MAX_MPDU] = {0}; bacnet_context_t *context = (bacnet_context_t*) (adapter -> context); bacnet_device_t *device; time_t current_seconds, elapsed_seconds = 0; int pdu_len; char *time_str, *node_id; time_t last_seconds,timeout_seconds; unsigned timeout = 100; BACNET_ADDRESS src = { 0 }; unsigned max_apdu = 0; mio_stanza_t *item; mio_response_t *publish_response; for (device = context -> node_devices; device; device = device -> nodemap.next) { time_str = mio_timestamp_create(); item = mio_pubsub_item_data_new(adapter -> connection); node_id = device -> node_id; last_seconds = time(NULL); timeout_seconds = (apdu_timeout() / 1000) * apdu_retries(); //if (!found) found = address_bind_request(device -> instance, &max_apdu, &target_address); if (!found) { Send_WhoIs(device -> instance, device -> instance); } while (!found) { current_seconds = time(NULL); if (current_seconds != last_seconds) tsm_timer_milliseconds((uint16_t) ((current_seconds - last_seconds) * 1000)); if (!found) { found = address_bind_request(device -> instance, &max_apdu,&target_address); } if (!found) { elapsed_seconds += (current_seconds - last_seconds); if (elapsed_seconds > timeout_seconds) { printf("\rError: APDU Timeout!\r\n"); return 1; } } pdu_len = datalink_receive(&src, &rx_buf[0], MAX_MPDU,timeout); if (pdu_len) { npdu_handler(&src, &rx_buf[0], pdu_len); } last_seconds = current_seconds; } int i; printf("n_objects %d\n", device -> n_objects); for ( i = 0; i < device -> n_objects; i++) { request_invoke_id = 0; while(TRUE) { printf("true\n"); if (found) { if (request_invoke_id == 0) { request_invoke_id = Send_Read_Property_Request( device->instance, device -> obj_types[i], device -> obj_ids[i], 85, -1); } else if (tsm_invoke_id_free(request_invoke_id)) break; else if (tsm_invoke_id_failed(request_invoke_id)) { fprintf(stderr,"\rError: TSM Timeout!\r\n"); tsm_free_invoke_id(request_invoke_id); return 1; } } pdu_len = datalink_receive(&src, &rx_buf[0], MAX_MPDU,timeout); if (pdu_len) { npdu_handler(&src, &rx_buf[0], pdu_len); } last_seconds = current_seconds; } if (error_detected) { error_detected = 0; return 1; } else { if (strcmp(value,"active") == 0) mio_item_transducer_value_add(item, NULL, device -> obj_names[i] , "1", value, time_str); else if (strcmp(value,"inactive") == 0) mio_item_transducer_value_add(item, NULL, device -> obj_names[i] , "0",value, time_str); else mio_item_transducer_value_add(item, NULL, device -> obj_names[i] , value, value, time_str); } } publish_response = mio_response_new(); while (adapter -> connection -> xmpp_conn -> state != XMPP_STATE_CONNECTED) usleep(1000); mio_item_publish_data(adapter -> connection,item,node_id,publish_response); free(time_str); mio_response_print(publish_response); mio_response_free(publish_response); mio_stanza_free(item); } return 0; }