Develop custom GATT profile on Linux - bluetooth

I need to create a program implementing custom GATT profile on Linux PC.
Question is: what options do I have for this?
As long as I can see, the only option is to develop a program on top of BlueZ stack. I guess it should have some sort of API to implement custom GATT profile. Is my guess right? Are there any API documents? Or at least what header files should I browse? And it would be great to have an example of something similar.
Ah, yes, I need two roles, both GATT server and client.
Any other alternatives? other BT stacks? Or may be higher level libraries?

Related

WebUSB API, for pushing commands/configuration to the device through webApp

I am doing some research on the WebUSB API for our company because we are going to start to manufacture devices in house.
Our current device manufacture comes with an application so the team can plug the device into a computer and diagnose it. Their application allows us to read outputs from the device, as well as pushing commands/configuration to the device over a wired connection.
Since this device is 100% ours, we are also responsible for building out the diagnostic tooling. We need some sort of interface that allows a user to read outputs and send commands/configuration to the device over a wired USB connection.
Is the webUSB the correct API? If not, what are some suggestions for accomplishing the requirement? Are we limited to building some sort of desktop or mobile application?
I would recommend resources below to read to help you understand if the WebUSB API fits your needs or not:
https://web.dev/devices-introduction/ helps you pick the appropriate API to communicate with a hardware device of your choice.
https://web.dev/build-for-webusb/ explains how to build a device to take full advantage of the WebUSB API.
From what you describe, WebUSB isn't strictly required but won't hurt either.
First and foremost, you will need to implement the USB interfaces reading data and sending configurations. It will be a custom protocol, and not one of the standard USB device classes such as HID, video or mass storage. The details of the protocol and if you use control, interrupt or bulk transfers is your choice.
I'm assuming you will connect the devices to Windows PCs, and you likely don't want to put money into writing device drivers. If so, the easiest approach is to add the required descriptors and control requests required for Microsoft OS 2.0 Descriptors. That way, the WinUSB driver will be installed automatically when the device is plugged in.
Using the WinUSB API, a Windows application will then be able to communicate with the USB device. No additional drivers are needed. (On macOS and Linux it's even easier as you don't need the Microsoft OS 2.0 Descriptors in the first place.)
On top of that you can implement the additional descriptors and control requests for WebUSB. It will provide the additional benefit that you can write a web application (instead of a native application) for communicating with the USB device. (Currently, you are restricted to the Chrome browser.) WebUSB devices should implement the WinUSB descriptors as the alternative (.INF files, manual installation process) is a pain.
The already mentioned web page https://web.dev/build-for-webusb/ is a complete example of how to implement it.

How to read data sent via bluetooth by an App

I am a developer and I have a Bluetooth Lamp that has RGB and Day/Warm Light that has a third party App to control it.
My goal is to do some automation with my Lamp.
Is there a way to read what this app is sending to my Lamp is order to simulate its functionality? The thing is this App is not possible to integrate with my Google assistant so I am trying to find a way to do it my self by making my own mobile application to control my Lamp.
Or maybe my question should be something like: is there a generic App that can control generic Bluetooth Lamps?
Any information is greatly appreciated.
You could either hack the hardware itself, or you could simply snoop on the communications to hack in to the lamp controls.
Otherwise, I would check out integration platforms like IFTTT, which allows some customization of control with proprietary systems.

jack audio application routing

I am quite new to the jack audio software.
I was wondering, whether it is possible to specific applications to specific outputs.
I know could make a virtual device that I can connect anyway I want. But that only works if I am able to select the virtual device as output device within the application, right?
But not all applications have the option to chose outputs.
So the question is whether I can select an application in jack audio and route it the a device of my choice.
Being able to do this is the main reason why Jack exists. You can connect anything to anything with an external patch bay, you don't need to use the UI of the application.
Examples of graphical patch bays you can use are (my) Patchage, Catia, and qjackctl. You can also use jack_connect on the command line.

BlueZ, do not require authentication

I'm working with BlueZ 3.x. I have a linux embedded device and I need to send and receive files using the bluetooth technology, with Obex. (Note: BlueZ 4.x doesn't even compile on our specific platform.)
I don't need PIN authentication, I even don't want it. It must remain as simple as possible for the end user.
I tried to set security none in hcid.conf but it doesn't seem to work.
So my question is:
Is it possible to send &/ receive files using Obex on bluetooth?
How to do it?
Does bluetooth devices (e.g. mobile phone) requires authentication?
You can use the OBEX protocoll for that, but you will also need the FTP or OPP profile (And GOEP, SPP & GAP since they depend on them)
The documentation can be found on BT SIG bluetooth.org, but you will have to be a member. I think some of the documentation is available to non members as well, go there and have a look.
Yes (if we are only talking about mobile phones)

Accessing Bluetooth virtual COM port on Windows without manual pairing

I need to connect to a Bluetooth device through virtual COM port created in Windows. It's easy when the port has been already created during manual pairing procedure. But I would like my application to relieve an user from the manual pairing of a device. I would like to present all devices in the range, allow user to chose one, and then create virtual COM port connected with the selected device. I'm not trying to avoid the pairing procedure itself, but rather I would like to invoke it by my application.
I started getting familiar with Microsoft Bluetooth API. And then some doubts arose. I've been wondering what happen if some user would use different (than Microsoft's) Bluetooth stack? Is the Microsoft's API the real Bluetooth API, which have to be implemented by any other Bluetooth stack provider? Or rather each provider has its own API, and the Microsoft's is only one of many other?
Thanks everyone for valuable input. I'd like to summarize what I've found so far. The Microsoft Bluetooth API is not operating system API. Application written against it will not cooperate correctly with any other Bluetooth stack. It seems that applications which are intended to cooperate with multiple stacks need to provide some stack abstraction layer, and stack specific code for all of them.The other solution is to allow user for manual pairing of the Bluetooth device, which eventually create some virtual device in the operating system (e.g., COM port). Then the application can use standard interface of such a device.
I can't speak for the Microsoft Bluetooth API, but there are multiple Bluetooth stacks available for the PC platform (even more for mobile devices).
The underlying API is defined by the Bluetooth Core Spec and so all stacks should be able to interact, in fact it is mandatory that they interop or they cannot use the Bluetooth name and logo.
As to pairing, your going to have a hard time getting devices to pair if they have default security, which requires a pin code.
Things might be simpler in the (near) future, as the Bluetooth standard has introduced a new security model, secure simple pairing, which has a 'just works' mode that requires no Pin code. This is still stronger then the current security, except against Man in the middle attacks. However, it could be a while before you see the chips with this feature in PCs.
If you can change to using .NET :-/ I can recommend our library 32feet.NET.
For explicit pairing there's BluetoothSecurity.PairDevice. We can also create the virtual port for you, for example:
BluetoothClient cli = new BluetoothClient();
BluetoothDeviceInfo[] list = cli.DiscoverDevices();
BluetoothDeviceInfo selected = GetUserToSelectOne(list);
BluetoothSecurity.PairDevice(selected, pin);
// Ask Win32 to create a virtual serial port
selected.SetServiceState(BluetoothService.SerialPort);
However I really don't like virtual serial ports so I always suggest that people use a normal sockets connection using our BluetoothClient class, it will automatically handle a pairing request if required.
On Win32 we support the stacks from Microsoft, Widcomm/Broadcom, and BlueSoleil. On Widcomm there's no support for SetServiceState there yet, and their API has no support for responding to pairing requests. BlueSoleil should support both.
A brief user's guide is at 32feet.NET — User’s Guide, and all the class documentation is available at the main site http://32feet.net, the Widcomm documentation is only in our code repository at the moment.

Resources