ble-0.4.0.0: examples/README.lhs
# ble - Bluetooth Low Energy for Haskell
*ble* is a Haskell library for writing Bluetooth Low Energy peripherals and
centrals.
For usage, see the [haddocks](https://hackage.haskell.org/package/ble). There
are also examples in
[`examples`](https://github.com/plow-technologies/ble/tree/master/examples)
directory.
## Example
The code below is a simple example of a complete Bluetooth Low Energy
application. The application allows a counter to be read, and adds one to the
value of the counter, as well as allowing the counter to be set to any value.
~~~ {.haskell}
module Main (main) where
import Bluetooth
import Control.Concurrent (threadDelay)
import Control.Concurrent.STM
import Control.Monad.IO.Class
main :: IO ()
main = do
ref <- newTVarIO 0
conn <- connect
x <- runBluetoothM (registerAndAdvertiseApplication $ app ref) conn
case x of
Right _ -> putStrLn "Started BLE counter application!"
Left e -> error $ "Error starting application " ++ show e
threadDelay maxBound
app :: TVar Int -> Application
app ref
= "/com/turingjump/example/counter"
& services .~ [counter ref]
counter :: TVar Int -> Service 'Local
counter ref
= "4f1f704f-0a0b-49e4-bd27-6368f27697a7"
& characteristics .~ [getCounter ref]
getCounter :: TVar Int -> CharacteristicBS 'Local
getCounter ref
= "90874979-563e-4224-9da6-3b1a6c03e97d"
& readValue ?~ encodeRead readV
& writeValue ?~ encodeWrite writeV
& properties .~ [CPRead, CPWrite]
where
readV :: Handler Int
readV = liftIO $ do
v <- atomically $ modifyTVar' ref succ >> readTVar ref
putStrLn $ "Value requested. New value: " ++ show v
return v
writeV :: Int -> Handler Bool
writeV i = liftIO $ do
v <- atomically $ swapTVar ref i
putStrLn $ "Value changed to: " ++ show i
putStrLn $ "Old value: " ++ show v
return True
~~~
You can also write centrals (clients). See `HeartRateClient` in the `examples`
directory.
## Requirements
`ble` currently only supports Linux, and requires Bluez versions 5.41 and up.
To see what version you are running, type:
``` bash
bluetoothd --version
```
### Contributing
Note that quite a number of tests are protected by a flag (`hasDBus`). This is
in part because of extra system dependencies; and in part because the tests
require mocking DBus objects, which in turn require changing the dbus
configuration files.
If you are contributing to this packages, you *should* run all tests (and
possibly write further ones utilizing the mock infrastructure). You'll need to
run:
``` bash
sudo ./test/Mock/dbus-permissions.sh
```
And then reboot (yes, terrible, but DBus has trouble reloading its
configuration).
You then need the python dependencies. Minimally, this will involve:
``` bash
pip install -r test/Mock/requirements.txt
```
`stack.yaml` has the `hasDBus` flag set, so if you're using `stack` you'll by
default be running all the tests.