Compare commits

...

4 Commits

Author SHA1 Message Date
Roberto Viola
a0a09e69f6 trying to register a new host without success (no error reported) 2022-11-07 13:40:27 +01:00
Roberto Viola
5e779dac47 fixing build 2022-11-06 09:37:50 +01:00
Roberto Viola
8c96866153 Merge branch 'master' into dirconswift 2022-11-06 08:35:45 +01:00
Roberto Viola
8f3ee11708 testing but the advertisment it doesn't work on zwift. It's visible on Discovery app 2022-10-28 21:48:46 +02:00
6 changed files with 209 additions and 1 deletions

View File

@@ -228,6 +228,7 @@
873824EE27E647A9004F1B46 /* service.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 873824D827E647A6004F1B46 /* service.cpp */; };
873824EF27E647A9004F1B46 /* query.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 873824DA27E647A7004F1B46 /* query.cpp */; };
873824F027E647A9004F1B46 /* server.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 873824DF27E647A8004F1B46 /* server.cpp */; };
873A1692290C3FAA00300DFA /* Dircon.swift in Compile Sources */ = {isa = PBXBuildFile; fileRef = 873A1691290C3FAA00300DFA /* Dircon.swift */; };
873CD20727EF8D8A000131BC /* inappproduct.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 873CD20227EF8D89000131BC /* inappproduct.cpp */; };
873CD20827EF8D8A000131BC /* inappstore.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 873CD20327EF8D89000131BC /* inappstore.cpp */; };
873CD20927EF8D8A000131BC /* inapppurchasebackend.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 873CD20427EF8D8A000131BC /* inapppurchasebackend.cpp */; };
@@ -936,6 +937,7 @@
873824DF27E647A8004F1B46 /* server.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = server.cpp; path = ../src/qmdnsengine/src/src/server.cpp; sourceTree = "<group>"; };
873824E027E647A8004F1B46 /* hostname_p.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = hostname_p.h; path = ../src/qmdnsengine/src/src/hostname_p.h; sourceTree = "<group>"; };
873824E127E647A8004F1B46 /* browser_p.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = browser_p.h; path = ../src/qmdnsengine/src/src/browser_p.h; sourceTree = "<group>"; };
873A1691290C3FAA00300DFA /* Dircon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Dircon.swift; path = ../src/ios/Dircon.swift; sourceTree = "<group>"; };
873CD20227EF8D89000131BC /* inappproduct.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = inappproduct.cpp; path = ../src/purchasing/inapp/inappproduct.cpp; sourceTree = "<group>"; };
873CD20327EF8D89000131BC /* inappstore.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = inappstore.cpp; path = ../src/purchasing/inapp/inappstore.cpp; sourceTree = "<group>"; };
873CD20427EF8D8A000131BC /* inapppurchasebackend.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = inapppurchasebackend.cpp; path = ../src/purchasing/inapp/inapppurchasebackend.cpp; sourceTree = "<group>"; };
@@ -2123,6 +2125,7 @@
68418A2D51B69FC30BF5A41C /* virtualbike.h */,
35E903698E72424585D33829 /* virtualtreadmill.h */,
C8CE72E7B224D8B886614E3F /* domyosbike.h */,
873A1691290C3FAA00300DFA /* Dircon.swift */,
);
name = Sources;
sourceTree = "<group>";
@@ -3096,6 +3099,7 @@
7DEEAF0C3D671FBFD84ACFCE /* moc_homeform.cpp in Compile Sources */,
934A3E33459C9220F257B271 /* moc_qfit.cpp in Compile Sources */,
873F0231274BE47D002D0349 /* moc_mcfbike.cpp in Compile Sources */,
873A1692290C3FAA00300DFA /* Dircon.swift in Compile Sources */,
8718CBAE263063CE004BF4EE /* moc_soleelliptical.cpp in Compile Sources */,
8738248227E646C4004F1B46 /* dirconprocessor.cpp in Compile Sources */,
87EFE45927A518F5006EA1C3 /* nautiluselliptical.cpp in Compile Sources */,

View File

@@ -2,6 +2,9 @@
#include "dirconpacket.h"
#include "qzsettings.h"
#include <QSettings>
#include <dns_sd.h>
#include <netdb.h>
#include <arpa/inet.h>
DirconProcessor::DirconProcessor(const QList<DirconProcessorService *> &my_services, const QString &serv_name,
quint16 serv_port, const QString &serv_sn, const QString &my_mac, QObject *parent)
@@ -27,6 +30,81 @@ bool DirconProcessor::initServer() {
return true;
}
#ifdef Q_OS_IOS
///< Callback for registration reply
static void register_reply_callback(DNSServiceRef sdRef,
DNSServiceFlags flags,
DNSServiceErrorType errorCode,
const char *name,
const char *regtype,
const char *domain,
void *context)
{
qDebug() << name << sdRef;
};
void
TXTRegisterCallback(DNSServiceRef sdRef __attribute__((unused)),
DNSRecordRef RecordRef __attribute__((unused)),
DNSServiceFlags flags __attribute__((unused)),
DNSServiceErrorType errorCode __attribute__((unused)),
void *context __attribute__((unused)))
{
qDebug() << errorCode;
}
const char* dns_service_strerror(DNSServiceErrorType err)
{
switch(err) {
case kDNSServiceErr_NoError: return "kDNSServiceErr_NoError";
case kDNSServiceErr_Unknown: return "kDNSServiceErr_Unknown";
case kDNSServiceErr_NoSuchName: return "kDNSServiceErr_NoSuchName";
case kDNSServiceErr_NoMemory: return "kDNSServiceErr_NoMemory";
case kDNSServiceErr_BadParam: return "kDNSServiceErr_BadParam";
case kDNSServiceErr_BadReference: return "kDNSServiceErr_BadReference";
case kDNSServiceErr_BadState: return "kDNSServiceErr_BadState";
case kDNSServiceErr_BadFlags: return "kDNSServiceErr_BadFlags";
case kDNSServiceErr_Unsupported: return "kDNSServiceErr_Unsupported";
case kDNSServiceErr_NotInitialized: return "kDNSServiceErr_NotInitialized";
case kDNSServiceErr_AlreadyRegistered: return "kDNSServiceErr_AlreadyRegistered";
case kDNSServiceErr_NameConflict: return "kDNSServiceErr_NameConflict";
case kDNSServiceErr_Invalid: return "kDNSServiceErr_Invalid";
case kDNSServiceErr_Firewall: return "kDNSServiceErr_Firewall";
case kDNSServiceErr_Incompatible: return "kDNSServiceErr_Incompatible";
case kDNSServiceErr_BadInterfaceIndex: return "kDNSServiceErr_BadInterfaceIndex";
case kDNSServiceErr_Refused: return "kDNSServiceErr_Refused";
case kDNSServiceErr_NoSuchRecord: return "kDNSServiceErr_NoSuchRecord";
case kDNSServiceErr_NoAuth: return "kDNSServiceErr_NoAuth";
case kDNSServiceErr_NoSuchKey: return "kDNSServiceErr_NoSuchKey";
case kDNSServiceErr_NATTraversal: return "kDNSServiceErr_NATTraversal";
case kDNSServiceErr_DoubleNAT: return "kDNSServiceErr_DoubleNAT";
case kDNSServiceErr_BadTime: return "kDNSServiceErr_BadTime";
default:
static char buf[32];
snprintf(buf, sizeof(buf), "%d", err);
return buf;
}
}
struct in_addr *atoaddr(char *address) {
struct hostent *host;
static struct in_addr saddr;
/* First try it as aaa.bbb.ccc.ddd. */
saddr.s_addr = inet_addr(address);
if (saddr.s_addr != -1) {
return &saddr;
}
host = gethostbyname(address);
if (host != NULL) {
return (struct in_addr *) *host->h_addr_list;
}
return NULL;
}
#endif
void DirconProcessor::initAdvertising() {
/* if (!zeroConf) {
qDebug() << "Dircon Adv init for" << service->uuid;
@@ -42,6 +120,7 @@ void DirconProcessor::initAdvertising() {
connect(zeroConf, SIGNAL(servicePublished()), this, SLOT(advOK()));
connect(zeroConf, SIGNAL(error(QZeroConf::error_t)), this, SLOT(advError(QZeroConf::error_t)));
}*/
if (!mdnsServer) {
qDebug() << "Dircon Adv init for" << serverName;
mdnsServer = new QMdnsEngine::Server(this);
@@ -60,8 +139,61 @@ void DirconProcessor::initAdvertising() {
((i++ < services.size() - 1) ? QStringLiteral(",") : QStringLiteral(""));
mdnsService.addAttribute(QByteArrayLiteral("ble-service-uuids"), ble_uuids.toUtf8());
mdnsService.setPort(serverPort);
mdnsProvider->update(mdnsService);
qDebug() << "Dircon Adv init for" << serverName << " end";
if(1) {
DNSServiceRef ref1 = NULL;
DNSServiceErrorType err;
char txtMac[2048];
TXTRecordRef recordMac;
TXTRecordCreate(&recordMac, 255, &txtMac);
err = TXTRecordSetValue(&recordMac, "mac-address", mac.toUtf8().length(), mac.toUtf8());
err = TXTRecordSetValue(&recordMac, "serial-number", serialN.toUtf8().length(), serialN.toUtf8());
err = TXTRecordSetValue(&recordMac, "ble-service-uuids", ble_uuids.toUtf8().length(), ble_uuids.toUtf8());
DNSRecordRef recordRef;
const char *hostname = serverName.toUtf8().constData();
DNSServiceErrorType error;
DNSServiceRef dnsRef;
struct in_addr *addr = atoaddr("192.168.0.46");
error = DNSServiceCreateConnection(&dnsRef);
if (error){
qDebug() << "error";
}
qDebug() << hostname;
error = DNSServiceRegisterRecord(dnsRef,
&recordRef,
kDNSServiceFlagsUnique | kDNSServiceFlagsShareConnection, //kDNSServiceFlagsShared | kDNSServiceFlagsAllowRemoteQuery,
0,
hostname,
kDNSServiceType_A,
kDNSServiceClass_IN,
sizeof(struct in_addr),
addr,
240,
TXTRegisterCallback,
NULL);
if (error){
qDebug() << "error" << dns_service_strerror(error);
}
err = DNSServiceRegister(&ref1, 0, 0, serverName.toUtf8().constData(), "_wahoo-fitness-tnp._tcp", "local", serverName.toUtf8().constData(), htons(serverPort), strlen(txtMac) /* txtLen */,
txtMac /* txtRecord */, register_reply_callback, NULL);
qDebug() << err;
if (err != kDNSServiceErr_NoError) {
qDebug() << "error in DNSServiceRegister: " << dns_service_strerror(err);
}
DNSServiceProcessResult(ref1);
} else
{
mdnsProvider->update(mdnsService);
}
}
}

View File

@@ -17,6 +17,7 @@ var pedometer = CMPedometer()
@objc public class healthkit:NSObject {
let w = watchAppStart()
var dirconServer: [Dircon] = []
@objc public func request()
{
@@ -28,6 +29,7 @@ var pedometer = CMPedometer()
if UIDevice.current.userInterfaceIdiom == .phone {
Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.updateHeartRate), userInfo: nil, repeats: true)
}
Server.server?.start()
LocalNotificationHelper.requestPermission()
@@ -44,6 +46,16 @@ var pedometer = CMPedometer()
//w.startWatchApp()
}
@objc public func dircon(name: String, port: UInt16, macAddress: String, serialNumber: String, bleServiceUuids: String) -> Bool {
do {
dirconServer.append(try Dircon(name: name, port: port, macAddress: macAddress, serialNumber: serialNumber, bleServiceUuids: bleServiceUuids))
return dirconServer.last!.start()
} catch {
}
return false
}
@objc public func heartRate() -> Int
{
return WatchKitConnection.currentHeartRate;

50
src/ios/Dircon.swift Normal file
View File

@@ -0,0 +1,50 @@
//
// Dircon.swift
// qdomyoszwift
//
// Created by Roberto Viola on 28/10/22.
//
import Foundation
import Network
import UIKit
class Dircon {
let listener: NWListener
var connections: [Connection] = []
init(name: String, port: UInt16, macAddress: String, serialNumber: String, bleServiceUuids: String) throws {
let o = NWProtocolUDP.Options()
let parameters = NWParameters(dtls: nil, udp: o)
parameters.includePeerToPeer = true
//parameters.requiredLocalEndpoint = NWEndpoint.hostPort(host: NWEndpoint.Host(name + "H"), port: NWEndpoint.Port(rawValue: port)!)
parameters.allowFastOpen = true
parameters.acceptLocalOnly = true
listener = try NWListener(using: parameters, on: NWEndpoint.Port(rawValue: port)!)
let records = ["mac-address": macAddress, "serial-number": serialNumber, "ble-service-uuids" : bleServiceUuids]
if #available(iOS 13.0, *) {
listener.service = NWListener.Service(name: name, type: "_wahoo-fitness-tnp._tcp", domain: "local", txtRecord: NWTXTRecord(records))
} else {
// Fallback on earlier versions
}
}
func start() -> Bool {
if(listener.service == nil) {
return false
}
listener.stateUpdateHandler = { newState in
print("listener.stateUpdateHandler \(newState)")
}
listener.newConnectionHandler = { [weak self] newConnection in
print("listener.newConnectionHandler \(newConnection)")
let connection = Connection(connection: newConnection)
self?.connections += [connection]
}
listener.start(queue: .main)
return true
}
}

View File

@@ -7,6 +7,7 @@ class lockscreen {
void request();
long heartRate();
long stepCadence();
bool dircon(const unsigned char* name, int nameLen, int port, const unsigned char* macAddress, int macAddressLen, const unsigned char* serialNumber, int serialNumberLen, const unsigned char* bleServiceUuids, int bleServiceUuidsLen);
void setKcal(double kcal);
void setDistance(double distance);

View File

@@ -39,6 +39,15 @@ long lockscreen::stepCadence()
return [h stepCadence];
}
bool lockscreen::dircon(const unsigned char* name, int nameLen, int port, const unsigned char* macAddress, int macAddressLen, const unsigned char* serialNumber, int serialNumberLen, const unsigned char* bleServiceUuids, int bleServiceUuidsLen)
{
NSString* Name = [[NSString alloc] initWithBytes:name length:nameLen encoding:NSUTF8StringEncoding];
NSString* MacAddress = [[NSString alloc] initWithBytes:macAddress length:macAddressLen encoding:NSUTF8StringEncoding];
NSString* SerialNumber = [[NSString alloc] initWithBytes:serialNumber length:serialNumberLen encoding:NSUTF8StringEncoding];
NSString* BleServiceUuids = [[NSString alloc] initWithBytes:bleServiceUuids length:bleServiceUuidsLen encoding:NSUTF8StringEncoding];
return [h dirconWithName:Name port:port macAddress:MacAddress serialNumber:SerialNumber bleServiceUuids:BleServiceUuids];
}
void lockscreen::setKcal(double kcal)
{
[h setKcalWithKcal:kcal];