/* * This Source Code Form is subject to the terms of the Mozilla Public License, * v. 2.0. If a copy of the MPL was not distributed with this file, You can * obtain one at https://mozilla.org/MPL/2.0/. */ #include #include #include #include #include "heart.h" LOG_MODULE_REGISTER(heart, 4); #define HEART_PERIOD K_MSEC(1000) #define HEART_STACK_SIZE 500 #define HEART_PRIO K_PRIO_PREEMPT(8) #define DNS_TIMEOUT (3 * MSEC_PER_SEC) ZBUS_CHAN_DEFINE( heartbeat_channel, struct heartbeat, NULL, NULL, ZBUS_OBSERVERS_EMPTY, ZBUS_MSG_INIT(.ttl_ms = 0) ); void mdns_result_cb(enum dns_resolve_status status, struct dns_addrinfo *info, void *user_data) { char hr_addr[NET_IPV6_ADDR_LEN]; char *hr_family; void *addr; switch (status) { case DNS_EAI_CANCELED: LOG_INF("mDNS query was canceled"); return; case DNS_EAI_FAIL: LOG_INF("mDNS resolve failed"); return; case DNS_EAI_NODATA: LOG_INF("Cannot resolve address using mDNS"); return; case DNS_EAI_ALLDONE: LOG_INF("mDNS resolving finished"); return; case DNS_EAI_INPROGRESS: break; default: LOG_INF("mDNS resolving error (%d)", status); return; } if (!info) { return; } if (info->ai_family == AF_INET) { hr_family = "IPv4"; addr = &net_sin(&info->ai_addr)->sin_addr; } else if (info->ai_family == AF_INET6) { hr_family = "IPv6"; addr = &net_sin6(&info->ai_addr)->sin6_addr; } else { LOG_ERR("Invalid IP address family %d", info->ai_family); return; } LOG_INF("%s %s address: %s", user_data ? (char *)user_data : "", hr_family, net_addr_ntop(info->ai_family, addr, hr_addr, sizeof(hr_addr))); } static void do_mdns_ipv6_lookup(void) { static const char *query = "thinkpad.local"; int ret; LOG_DBG("Doing mDNS IPv6 query"); ret = dns_get_addr_info(query, DNS_QUERY_TYPE_AAAA, NULL, mdns_result_cb, (void *)query, DNS_TIMEOUT); if (ret < 0) { LOG_ERR("Cannot resolve mDNS IPv6 address (%d)", ret); return; } LOG_DBG("mDNS v6 query sent"); } static void heart_thread_function(void *ptr1, void *ptr2, void *ptr3) { LOG_INF("Starting to beat"); struct heartbeat heartbeat = {.ttl_ms = 1100}; k_msleep(2000); LOG_INF("Starting this thing"); do_mdns_ipv6_lookup(); while (true) { LOG_DBG("Heart beat"); int ret = zbus_chan_pub(&heartbeat_channel, &heartbeat, K_FOREVER); if (ret < 0) { LOG_ERR("Could not publish heartbeat"); } k_sleep(HEART_PERIOD); } } K_THREAD_DEFINE(heart_thread, HEART_STACK_SIZE, heart_thread_function, NULL, NULL, NULL, HEART_PRIO, 0, 0);